psb_output_android.c revision 0a86723905982451dd72a9cad792b8cb8e8528ae
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]) 6109998e330bbcbf835798128768e590772f5a5737Shuduo Sang#define MAX_OVERLAY_IDLE_FRAME 4 620da1930627209986e8db220799a690f816494401Austin Yuan 635fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wangenum { 645fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang eWidiOff = 1, 655fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang eWidiClone = 2, 665fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang eWidiExtendedVideo = 3, 675fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang}; 6862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangextern unsigned int update_forced; 692befccec034c13d34746a9e87149889d59ac767bFei Jiang 70f91c8768670386683a281cc39141e21bdda9c97fKun Wanginline int va2hw_rotation(int va_rotate) 71f91c8768670386683a281cc39141e21bdda9c97fKun Wang{ 72f91c8768670386683a281cc39141e21bdda9c97fKun Wang switch (va_rotate) { 73f91c8768670386683a281cc39141e21bdda9c97fKun Wang case VA_ROTATION_90: 74f91c8768670386683a281cc39141e21bdda9c97fKun Wang return HAL_TRANSFORM_ROT_270; 75f91c8768670386683a281cc39141e21bdda9c97fKun Wang case VA_ROTATION_180: 76f91c8768670386683a281cc39141e21bdda9c97fKun Wang return HAL_TRANSFORM_ROT_180; 772d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang case VA_ROTATION_270: 78f91c8768670386683a281cc39141e21bdda9c97fKun Wang return HAL_TRANSFORM_ROT_90; 7962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangdefaut: 80f91c8768670386683a281cc39141e21bdda9c97fKun Wang return 0; 81f91c8768670386683a281cc39141e21bdda9c97fKun Wang } 82f91c8768670386683a281cc39141e21bdda9c97fKun Wang 83f91c8768670386683a281cc39141e21bdda9c97fKun Wang return 0; 84f91c8768670386683a281cc39141e21bdda9c97fKun Wang} 85f91c8768670386683a281cc39141e21bdda9c97fKun Wang 862befccec034c13d34746a9e87149889d59ac767bFei Jiangvoid *psb_android_output_init(VADriverContextP ctx) 87437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 88437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 892befccec034c13d34746a9e87149889d59ac767bFei Jiang char put_surface[1024]; 9054752e65b02b1a84c491e3f9c964046faeea306eKun Wang struct drm_psb_register_rw_arg regs; 912befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_android_output_p output = calloc(1, sizeof(psb_android_output_s)); 92ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan struct fb_var_screeninfo vinfo; 932befccec034c13d34746a9e87149889d59ac767bFei Jiang int fbfd = -1; 942befccec034c13d34746a9e87149889d59ac767bFei Jiang int ret; 95437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 962befccec034c13d34746a9e87149889d59ac767bFei Jiang if (output == NULL) { 972befccec034c13d34746a9e87149889d59ac767bFei Jiang psb__error_message("Can't malloc memory\n"); 98ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return NULL; 99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1000da1930627209986e8db220799a690f816494401Austin Yuan memset(output, 0, sizeof(psb_android_output_s)); 101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1022befccec034c13d34746a9e87149889d59ac767bFei Jiang /* Guess the screen size */ 1032befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_width = 800; 1042befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_height = 480; 105437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1062befccec034c13d34746a9e87149889d59ac767bFei Jiang // Open the frame buffer for reading 1070da1930627209986e8db220799a690f816494401Austin Yuan memset(&vinfo, 0, sizeof(vinfo)); 1082befccec034c13d34746a9e87149889d59ac767bFei Jiang fbfd = open("/dev/graphics/fb0", O_RDONLY); 1092befccec034c13d34746a9e87149889d59ac767bFei Jiang if (fbfd) { 110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) 111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Error reading screen information.\n"); 1122befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1132befccec034c13d34746a9e87149889d59ac767bFei Jiang close(fbfd); 1142befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_width = vinfo.xres; 1152befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_height = vinfo.yres; 1162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /* TS by default */ 1182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 11962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->color_key = 0x000001; /*light blue*/ 12062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->overlay_idle_frame = 1; 121437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1228803df709aec9d485d757c681791d708f9a88fe6Austin Yuan if (psb_parse_config("PSB_VIDEO_CTEXTURES", &put_surface[0]) == 0) { 1238803df709aec9d485d757c681791d708f9a88fe6Austin Yuan psb__information_message("PSB_VIDEO_CTEXTURES is enabled for vaPutSurfaceBuf\n"); 1248803df709aec9d485d757c681791d708f9a88fe6Austin Yuan driver_data->ctexture = 1; /* Init CTEXTURE for vaPutSurfaceBuf */ 1258803df709aec9d485d757c681791d708f9a88fe6Austin Yuan } 126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12754752e65b02b1a84c491e3f9c964046faeea306eKun Wang if (psb_parse_config("PSB_VIDEO_TS", &put_surface[0]) == 0) { 12854752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__information_message("Putsurface use texstreaming\n"); 12954752e65b02b1a84c491e3f9c964046faeea306eKun Wang driver_data->output_method = PSB_PUTSURFACE_FORCE_TEXSTREAMING; 13054752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 13154752e65b02b1a84c491e3f9c964046faeea306eKun Wang 132bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) { 1332befccec034c13d34746a9e87149889d59ac767bFei Jiang psb__information_message("Putsurface use client overlay\n"); 1342befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY; 13554752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 13654752e65b02b1a84c491e3f9c964046faeea306eKun Wang 13754752e65b02b1a84c491e3f9c964046faeea306eKun Wang if (IS_MFLD(driver_data)) { 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->coverlay = 1; 13965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan output->psb_HDMIExt_info = psb_HDMIExt_init(ctx, output); 14065174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan if (!output->psb_HDMIExt_info) { 14154752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__error_message("Failed to init psb_HDMIExt.\n"); 142ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan free(output); 143ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return NULL; 14454752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1472befccec034c13d34746a9e87149889d59ac767bFei Jiang return output; 148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1502befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx) 151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 15254752e65b02b1a84c491e3f9c964046faeea306eKun Wang INIT_DRIVER_DATA; 15365174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan INIT_OUTPUT_PRIV; 1542befccec034c13d34746a9e87149889d59ac767bFei Jiang //psb_android_output_p output = GET_OUTPUT_DATA(ctx); 15565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan if (IS_MFLD(driver_data)) { 15665174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan psb_HDMIExt_deinit(output); 15765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan } 1582befccec034c13d34746a9e87149889d59ac767bFei Jiang 1592befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_SUCCESS; 160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1622befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture( 163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned char* data, 166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srcw, 169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srch, 170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short destx, 171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short destw, 173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short desth, 174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int flags /* de-interlacing flags */ 175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 1782befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_OUTPUT_PRIV; 179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 1802befccec034c13d34746a9e87149889d59ac767bFei Jiang int offset = 0; 1812befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface_p psb_surface; 182437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1832befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_surface = SURFACE(surface); 1842befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface = obj_surface->psb_surface; 185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 18654752e65b02b1a84c491e3f9c964046faeea306eKun Wang // psb_surface->buf.drm_buf; 18754752e65b02b1a84c491e3f9c964046faeea306eKun Wang // psb_surface->buf.pl_flags; 18854752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch, 18954752e65b02b1a84c491e3f9c964046faeea306eKun Wang destx, desty, destw, desth, 0, /* no subtitle */ 190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_surface->width, obj_surface->height, 191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_surface->stride, psb_surface->buf.drm_buf, 192bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb_surface->buf.pl_flags, 1 /* need wrap dst */); 1932befccec034c13d34746a9e87149889d59ac767bFei Jiang 1942befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_android_postBuffer(offset); 19554752e65b02b1a84c491e3f9c964046faeea306eKun Wang 1961f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare return VA_STATUS_SUCCESS; 197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1992befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay( 200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srcw, 205437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srch, 2062befccec034c13d34746a9e87149889d59ac767bFei Jiang short destx, /* screen cooridination */ 207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short destw, 209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short desth, 210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int flags /* de-interlacing flags */ 211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 2132befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_OUTPUT_PRIV; 214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2162befccec034c13d34746a9e87149889d59ac767bFei Jiang /* USE_FIT_SCR_SIZE */ 2172befccec034c13d34746a9e87149889d59ac767bFei Jiang /* calculate fit screen size of frame */ 2182befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short _scr_x = output->screen_width; 2192befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short _scr_y = output->screen_height; 220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun float _slope_xy = (float)srch / srcw; 221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short _destw = (short)(_scr_y / _slope_xy); 222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short _desth = (short)(_scr_x * _slope_xy); 2232befccec034c13d34746a9e87149889d59ac767bFei Jiang short _pos_x, _pos_y; 224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2252befccec034c13d34746a9e87149889d59ac767bFei Jiang if (_destw <= _scr_x) { 2262befccec034c13d34746a9e87149889d59ac767bFei Jiang _desth = _scr_y; 227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun _pos_x = (_scr_x - _destw) >> 1; 2282befccec034c13d34746a9e87149889d59ac767bFei Jiang _pos_y = 0; 2292befccec034c13d34746a9e87149889d59ac767bFei Jiang } else { 2302befccec034c13d34746a9e87149889d59ac767bFei Jiang _destw = _scr_x; 2312befccec034c13d34746a9e87149889d59ac767bFei Jiang _pos_x = 0; 232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun _pos_y = (_scr_y - _desth) >> 1; 233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 2342befccec034c13d34746a9e87149889d59ac767bFei Jiang destx += _pos_x; 2352befccec034c13d34746a9e87149889d59ac767bFei Jiang desty += _pos_y; 2362befccec034c13d34746a9e87149889d59ac767bFei Jiang destw = _destw; 2372befccec034c13d34746a9e87149889d59ac767bFei Jiang desth = _desth; 238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 239ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("psb_putsurface_overlay: src (%d, %d, %d, %d), destx (%d, %d, %d, %d).\n", 24054752e65b02b1a84c491e3f9c964046faeea306eKun Wang srcx, srcy, srcw, srch, destx, desty, destw, desth); 2412befccec034c13d34746a9e87149889d59ac767bFei Jiang /* display by overlay */ 2422befccec034c13d34746a9e87149889d59ac767bFei Jiang vaStatus = psb_putsurface_overlay( 243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, srcx, srcy, srcw, srch, 244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx, desty, destw, desth, /* screen coordinate */ 245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_A, PIPEA); 246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 2472befccec034c13d34746a9e87149889d59ac767bFei Jiang return vaStatus; 248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 250ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 251ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin YuanVAStatus psb_putsurface_ts( 252ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VADriverContextP ctx, 253ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VASurfaceID surface, 254ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan void *android_isurface, 25562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang int buffer_index, 256ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short srcx, 257ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short srcy, 258ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short srcw, 259ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short srch, 260ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short destx, 261ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short desty, 262ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short destw, 263ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short desth, 264ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VARectangle *cliprects, /* client supplied clip list */ 265ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned int number_cliprects, /* number of clip rects in the clip list */ 266ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned int flags /* de-interlacing flags */ 267ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan) 268ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{ 269ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_DRIVER_DATA; 270ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_OUTPUT_PRIV; 271ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan object_surface_p obj_surface = SURFACE(surface); 27262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 27362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->overlay_idle_frame == 0) { 27462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_resetParams(); 27562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang update_forced = 1; 27662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang } 277ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 278ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* blend/positioning setting can be called by app directly, or enable VA_ENABLE_BLEND flag to let driver call */ 279ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (flags & VA_ENABLE_BLEND) 280ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_android_texture_streaming_set_blend(destx, desty, destw, desth, 281ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->clear_color, 282ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->blend_color, 283ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->blend_mode); 284ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /*cropping can be also used for dynamic resolution change feature, only high to low resolution*/ 285ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /*by default, srcw and srch is set to video width and height*/ 286ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if ((0 == srcw) || (0 == srch)) { 287ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcw = obj_surface->width; 288ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srch = obj_surface->height_origin; 289ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 290ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_android_texture_streaming_set_texture_dim(srcw, srch); 291f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->va_rotate) 292f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb_android_texture_streaming_set_rotate(va2hw_rotation(driver_data->va_rotate)); 29362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 294ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#if 0 295ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* use cliprect for crop */ 296ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (cliprects && (number_cliprects == 1)) 297ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_android_texture_streaming_set_crop(cliprects->x, cliprects->y, cliprects->width, cliprects->height); 298ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#endif 299ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 30062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_display(buffer_index); 301cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan 302cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan driver_data->overlay_idle_frame++; 30362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang update_forced = 0; 304ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 305ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return VA_STATUS_SUCCESS; 306ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan} 307ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 3085fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang 3090da1930627209986e8db220799a690f816494401Austin Yuanstatic int psb_update_destbox( 3100da1930627209986e8db220799a690f816494401Austin Yuan VADriverContextP ctx 3110da1930627209986e8db220799a690f816494401Austin Yuan) 3120da1930627209986e8db220799a690f816494401Austin Yuan{ 3130da1930627209986e8db220799a690f816494401Austin Yuan INIT_DRIVER_DATA; 3140da1930627209986e8db220799a690f816494401Austin Yuan INIT_OUTPUT_PRIV; 3150da1930627209986e8db220799a690f816494401Austin Yuan short destx; 3160da1930627209986e8db220799a690f816494401Austin Yuan short desty; 3170da1930627209986e8db220799a690f816494401Austin Yuan unsigned short destw; 3180da1930627209986e8db220799a690f816494401Austin Yuan unsigned short desth; 3190da1930627209986e8db220799a690f816494401Austin Yuan VAStatus vaStatus = VA_STATUS_SUCCESS; 3200da1930627209986e8db220799a690f816494401Austin Yuan 3210da1930627209986e8db220799a690f816494401Austin Yuan psb_android_get_destbox(&destx, &desty, &destw, &desth); 322f91c8768670386683a281cc39141e21bdda9c97fKun Wang /*psb__information_message("destbox = (%d,%d,%d,%d)\n", destx, desty, destw, desth);*/ 3230da1930627209986e8db220799a690f816494401Austin Yuan if ((destx >= 0) && (desty >= 0) && 3240da1930627209986e8db220799a690f816494401Austin Yuan ((destx + destw) <= output->screen_width) && 3250da1930627209986e8db220799a690f816494401Austin Yuan ((desty + desth) <= output->screen_height) && 3260da1930627209986e8db220799a690f816494401Austin Yuan (output->destx != destx || 3270da1930627209986e8db220799a690f816494401Austin Yuan output->desty != desty || 3280da1930627209986e8db220799a690f816494401Austin Yuan output->destw != destw || 3290da1930627209986e8db220799a690f816494401Austin Yuan output->desth != desth)) { 3300da1930627209986e8db220799a690f816494401Austin Yuan output->destx = destx; 3310da1930627209986e8db220799a690f816494401Austin Yuan output->desty = desty; 3320da1930627209986e8db220799a690f816494401Austin Yuan output->destw = destw; 3330da1930627209986e8db220799a690f816494401Austin Yuan output->desth = desth; 3344338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->new_destbox = 1; 3350da1930627209986e8db220799a690f816494401Austin Yuan 3360da1930627209986e8db220799a690f816494401Austin Yuan LOGD("==========New Destbox=============\n"); 3370da1930627209986e8db220799a690f816494401Austin Yuan LOGD("output->destbox = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth); 3380da1930627209986e8db220799a690f816494401Austin Yuan } 3390da1930627209986e8db220799a690f816494401Austin Yuan 3400da1930627209986e8db220799a690f816494401Austin Yuan return vaStatus; 3410da1930627209986e8db220799a690f816494401Austin Yuan} 342ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 343ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuanstatic int psb_check_outputmethod( 344ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VADriverContextP ctx, 345ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VASurfaceID surface, 34688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang unsigned short srcw, 34788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang unsigned short srch, 348ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan void *android_isurface, 3490da1930627209986e8db220799a690f816494401Austin Yuan psb_hdmi_mode *hdmi_mode 350ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan) 351ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{ 352ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_DRIVER_DATA; 353ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_OUTPUT_PRIV; 354ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_HDMIExt_info_p psb_HDMIExt_info = (psb_HDMIExt_info_p)output->psb_HDMIExt_info; 3550da1930627209986e8db220799a690f816494401Austin Yuan object_surface_p obj_surface; 3565fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang int rotation = 0, widi = 0; 3572d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang int delta_rotation = 0; 3582d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang int srf_rotate; /* primary surface rotation */ 3592d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang psb_surface_p rotate_surface; /* rotate surface */ 3602d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang int rotate_srf_rotate = -1; /* degree of the rotate surface */ 361ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 36288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang if ((srcw >= 2048) || (srch >= 2048)) { 36388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang psb__information_message("Clip size extend overlay hw limit, use texstreaming\n"); 36488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 36588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang return 0; 36688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang } 36788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang 368ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* use saved status to avoid per-frame checking */ 369ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if ((driver_data->frame_count % driver_data->outputmethod_checkinterval) != 0) { 370ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan *hdmi_mode = psb_HDMIExt_get_mode(output); 371ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return 0; 372ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 373ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 374ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* check the status at outputmethod_checkinterval frequency */ 375ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* at first check HDMI status */ 376ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (psb_HDMIExt_update(ctx, psb_HDMIExt_info)) { 377ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__error_message("%s: Failed to update HDMIExt info.\n", __FUNCTION__); 3780da1930627209986e8db220799a690f816494401Austin Yuan return -1; 379ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 380ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 381ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan *hdmi_mode = psb_HDMIExt_get_mode(output); 3820a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang if ((*hdmi_mode == EXTENDED_VIDEO) || (*hdmi_mode == CLONE)) { 383dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang unsigned short _destw, _desth; 384dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang short _pos_x, _pos_y; 385dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang unsigned short crtc_width = 0, crtc_height = 0; 3860a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang float _slope_xy; 3870a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang 3880a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang /* need to handle VA rotation, and set WM rotate to 0 3890a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang * for Android, MIPI0/HDMI has the same WM rotation always 3900a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang */ 3910a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang if (driver_data->mipi0_rotation != 0) { 3920a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang driver_data->mipi0_rotation = 0; 3930a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang driver_data->hdmi_rotation = 0; 3940a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang output->new_destbox = 1; 3950a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang psb_RecalcRotate(ctx); 3960a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang } 397dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang 398dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang psb_HDMIExt_get_prop(output, &crtc_width, &crtc_height); 399dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang 400dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang /*recalculate the render box to fit the ratio of height/width*/ 4010a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang if ((driver_data->extend_rotation == VA_ROTATION_90) || 4020a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang (driver_data->extend_rotation == VA_ROTATION_270)) 4030a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang _slope_xy = (float)srcw / srch; 4040a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang else 4050a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang _slope_xy = (float)srch / srcw; 4060a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang 407dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _destw = (short)(crtc_height / _slope_xy); 408dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _desth = (short)(crtc_width * _slope_xy); 409dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang if (_destw <= crtc_width) { 410dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _desth = crtc_height; 411dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _pos_x = (crtc_width - _destw) >> 1; 412dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _pos_y = 0; 413dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang } else { 414dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _destw = crtc_width; 415dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _pos_x = 0; 416dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang _pos_y = (crtc_height - _desth) >> 1; 417dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang } 418dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang driver_data->render_rect.x = _pos_x; 419dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang driver_data->render_rect.y = _pos_y; 420dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang driver_data->render_rect.width = _destw; 421dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang driver_data->render_rect.height = _desth; 4222d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang psb__information_message("HDMI mode is on (%d), Render Rect: (%d,%d,%d,%d)\n", 4232d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang *hdmi_mode, 424ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->render_rect.x, driver_data->render_rect.y, 425ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->render_rect.width, driver_data->render_rect.height); 4260da1930627209986e8db220799a690f816494401Austin Yuan return 0; 4275fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang } 428ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 4294338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /*Update output destbox using layerbuffer's visible region*/ 4304338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang psb_update_destbox(ctx); 4314338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4324338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) 433f91c8768670386683a281cc39141e21bdda9c97fKun Wang || (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)) 4344338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang return 0; 4354338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4364338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /*If overlay can not get correct destbox, use texstreaming.*/ 437605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang if (output->destw == 0 || output->desth == 0 || 438605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang ((output->destw == srcw) && (output->desth == srch))) { 4392d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang psb__information_message("No proper destbox, use texstreaming (%dx%d+%d+%d)\n", 4402d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang output->destw, output->desth, output->destx, output->desty); 4414338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 4424338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang return 0; 4434338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang } 4444338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4450da1930627209986e8db220799a690f816494401Austin Yuan /* HDMI is not enabled */ 4465fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang psb_android_surfaceflinger_status(android_isurface, &output->sf_composition, &rotation, &widi); 4475fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang if (widi == eWidiClone) { 4485fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang psb__information_message("WIDI service is detected, use texstreaming\n"); 4495fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 450cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */ 4514338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4525fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang return 0; 4535fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang } 4544338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4550da1930627209986e8db220799a690f816494401Austin Yuan /* only care local rotation */ 4562d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang delta_rotation = Rotation2Angle(driver_data->mipi0_rotation) - Rotation2Angle(rotation); 4572d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang if ((((abs(delta_rotation) == 90) || (abs(delta_rotation) == 270)) && output->new_destbox) || 4582d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang (abs(delta_rotation) == 180)) { 459f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb__information_message("New rotation degree %d of MIPI0 WM, Recalc rotation\n", rotation); 460f91c8768670386683a281cc39141e21bdda9c97fKun Wang driver_data->mipi0_rotation = rotation; 461f91c8768670386683a281cc39141e21bdda9c97fKun Wang driver_data->hdmi_rotation = rotation; 462f91c8768670386683a281cc39141e21bdda9c97fKun Wang 463f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb_RecalcRotate(ctx); 4640da1930627209986e8db220799a690f816494401Austin Yuan } 465605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang output->new_destbox = 0; 4660da1930627209986e8db220799a690f816494401Austin Yuan 4670da1930627209986e8db220799a690f816494401Austin Yuan obj_surface = SURFACE(surface); 4680da1930627209986e8db220799a690f816494401Austin Yuan if (GET_SURFACE_INFO_protect(obj_surface->psb_surface)) { 4690da1930627209986e8db220799a690f816494401Austin Yuan psb__information_message("Protected surface, use overlay\n"); 4700da1930627209986e8db220799a690f816494401Austin Yuan driver_data->output_method = PSB_PUTSURFACE_COVERLAY; 4710da1930627209986e8db220799a690f816494401Austin Yuan 4720da1930627209986e8db220799a690f816494401Austin Yuan return 0; 4730da1930627209986e8db220799a690f816494401Austin Yuan } 4740da1930627209986e8db220799a690f816494401Austin Yuan 4750da1930627209986e8db220799a690f816494401Austin Yuan if (output->sf_composition) { 4760da1930627209986e8db220799a690f816494401Austin Yuan psb__information_message("Composition is detected, use texstreaming\n"); 4770da1930627209986e8db220799a690f816494401Austin Yuan driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 4780da1930627209986e8db220799a690f816494401Austin Yuan return 0; 4790da1930627209986e8db220799a690f816494401Austin Yuan } 4800da1930627209986e8db220799a690f816494401Austin Yuan 4812d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang srf_rotate = GET_SURFACE_INFO_rotate(obj_surface->psb_surface); 4822d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang rotate_surface = obj_surface->psb_surface_rotate; 4832d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang if (rotate_surface != NULL) 4842d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang rotate_srf_rotate = GET_SURFACE_INFO_rotate(rotate_surface); 4850a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang 4862d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang psb__information_message("SF rotation %d, VA rotation %d, final MSVDX rotation %d\n", 4872d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang rotation, driver_data->va_rotate, driver_data->local_rotation); 4882d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang psb__information_message("Primary surface rotation %d, rotated surface rotation %d\n", 4892d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang srf_rotate, rotate_srf_rotate); 4902d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang 4912d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang /* The surface rotation is not same with the final rotation */ 4920a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang if ((driver_data->local_rotation != 0) && 4932d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang ((srf_rotate != driver_data->local_rotation) || (rotate_srf_rotate != driver_data->local_rotation))) { 4942d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang psb__information_message("Use texstreaming due to different VA surface rotation and final rotaion\n", 4952d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang srf_rotate, rotate_srf_rotate); 4962d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 4972d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang return 0; 498ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 499ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 5000da1930627209986e8db220799a690f816494401Austin Yuan driver_data->output_method = PSB_PUTSURFACE_COVERLAY; 5010da1930627209986e8db220799a690f816494401Austin Yuan 502ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return 0; 503ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan} 504ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 5052befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface( 506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 5082befccec034c13d34746a9e87149889d59ac767bFei Jiang void *android_isurface, 509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srcw, 512437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srch, 513437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short destx, 514437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 515437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short destw, 516437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short desth, 517437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VARectangle *cliprects, /* client supplied clip list */ 518437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int number_cliprects, /* number of clip rects in the clip list */ 519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int flags /* de-interlacing flags */ 5202befccec034c13d34746a9e87149889d59ac767bFei Jiang) 521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 522437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 5232befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_OUTPUT_PRIV; 524437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface; 525437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 52654752e65b02b1a84c491e3f9c964046faeea306eKun Wang PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 52754752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb_hdmi_mode hdmi_mode = OFF; 52862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang int sf_composition = 0, buffer_index = 0, i = 0; 52962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang uint32_t ttm_handle; 53062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_surface_p psb_surface; 531437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 532437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_surface = SURFACE(surface); 533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_surface) { 534437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; 535437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 536437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 53854752e65b02b1a84c491e3f9c964046faeea306eKun Wang 5395fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang if ((NULL == cliprects) && (0 != number_cliprects)) { 54088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 54188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang DEBUG_FAILURE; 54288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang return vaStatus; 54388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang } 54488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang 54554752e65b02b1a84c491e3f9c964046faeea306eKun Wang if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) || 5460da1930627209986e8db220799a690f816494401Austin Yuan (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) { 54754752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__error_message("vaPutSurface: source rectangle passed from upper layer is not correct.\n"); 54854752e65b02b1a84c491e3f9c964046faeea306eKun Wang return VA_STATUS_ERROR_UNKNOWN; 54954752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 55054752e65b02b1a84c491e3f9c964046faeea306eKun Wang if ((destx < 0) || (desty < 0)) { 55154752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__error_message("vaPutSurface: dest rectangle passed from upper layer is not correct.\n"); 5523f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan return VA_STATUS_ERROR_UNKNOWN; 5533f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan } 55454752e65b02b1a84c491e3f9c964046faeea306eKun Wang 5552befccec034c13d34746a9e87149889d59ac767bFei Jiang if (driver_data->dummy_putsurface) { 5563f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan psb__information_message("vaPutSurface: dummy mode, return directly\n"); 5572befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_SUCCESS; 5582befccec034c13d34746a9e87149889d59ac767bFei Jiang } 5592befccec034c13d34746a9e87149889d59ac767bFei Jiang 56062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang /*get bcd buffer index of current surface*/ 56162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_surface = obj_surface->psb_surface; 56262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang ttm_handle = (uint32_t)(wsbmKBufHandle(wsbmKBuf(psb_surface->buf.drm_buf))); 56362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 56462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang for (i = 0; i < driver_data->bcd_buffer_num; i++) { 56562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->bcd_ttm_handles[i] == ttm_handle) 56662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang break; 56762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang } 56862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (i == driver_data->bcd_buffer_num) { 56962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb__error_message("Failed to get buffer index.\n"); 57062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang return VA_STATUS_ERROR_UNKNOWN; 57162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang } 57262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang buffer_index = i; 57362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 5745b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang /* set the current displaying video frame into kernel */ 5752d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang psb_surface_set_displaying(driver_data, obj_surface->width, obj_surface->height_origin, obj_surface->psb_surface); 57662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 577ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* exit MRST path at first */ 578ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (IS_MRST(driver_data)) { 579ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) { /* overlay is for testing, not POR */ 580ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("Force overlay to display\n"); 581ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan vaStatus = psb_putsurface_coverlay(ctx, surface, 582ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 583ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 584ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 585ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } else { 586ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("Use texstreaming to display.\n"); 58762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index, 588ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 589ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 590ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan cliprects, number_cliprects, /* number of clip rects in the clip list */ 591ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 59265174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan } 59354752e65b02b1a84c491e3f9c964046faeea306eKun Wang 594ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return vaStatus; 59554752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 596ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 5970da1930627209986e8db220799a690f816494401Austin Yuan if (psb_android_register_isurface(android_isurface, driver_data->bcd_id, srcw, srch)) { 5980da1930627209986e8db220799a690f816494401Austin Yuan psb__error_message("In psb_PutSurface, android_isurface is not a valid isurface object.\n"); 5990da1930627209986e8db220799a690f816494401Austin Yuan return VA_STATUS_ERROR_UNKNOWN; 6000da1930627209986e8db220799a690f816494401Austin Yuan } 6010da1930627209986e8db220799a690f816494401Austin Yuan 602ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* time for MFLD platform */ 60388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang psb_check_outputmethod(ctx, surface, srcw, srch, android_isurface, &hdmi_mode); 604ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 605dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang if (hdmi_mode == UNDEFINED) { 606dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang psb__information_message("HDMI: Undefined mode, drop the frame.\n"); 607dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang return vaStatus; 608dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang } 609dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang 610ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* Extvideo: Use overlay to render external HDMI display */ 611ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (hdmi_mode == EXTENDED_VIDEO) { 612ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("HDMI: ExtVideo mode enabled, use overlay to render external HDMI display.\n"); 6130da1930627209986e8db220799a690f816494401Austin Yuan /*we also need to clear local display if colorkey dirty.*/ 61462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->overlay_idle_frame != 0) { 61562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000); 61662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_display(buffer_index); 61762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->overlay_idle_frame = 0; 6180da1930627209986e8db220799a690f816494401Austin Yuan } 619bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang vaStatus = psb_putsurface_overlay(ctx, surface, 620bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang srcx, srcy, srcw, srch, 621bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.x, driver_data->render_rect.y, 622bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.width, driver_data->render_rect.height, 623bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang flags, OVERLAY_A, PIPEB); 624ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 625ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return vaStatus; 626ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 627ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 628ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* Clone mode: Use TS to render both MIPI and HDMI display */ 629ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (hdmi_mode == CLONE) { 630ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("HDMI: Clone mode enabled, use texsteaming for both devices\n"); 63162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index, 632ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 633ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 634ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan cliprects, number_cliprects, /* number of clip rects in the clip list */ 635ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 636ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return vaStatus; 637ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 638ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 6390da1930627209986e8db220799a690f816494401Austin Yuan /* local video playback */ 6400da1930627209986e8db220799a690f816494401Austin Yuan if ((driver_data->output_method == PSB_PUTSURFACE_TEXSTREAMING) || 641f91c8768670386683a281cc39141e21bdda9c97fKun Wang (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)) { 642ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("MIPI: Use texstreaming to display.\n"); 643ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 64462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index, 645ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 646ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 647ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan cliprects, number_cliprects, /* number of clip rects in the clip list */ 648ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 649ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } else { 650ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("MIPI: Use overlay to display.\n"); 651ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 6524338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /*initialize output destbox using default destbox if it has not been initialized until here.*/ 6534338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang if (output->destw == 0 || output->desth == 0) { 6544338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->destx = (destx > 0) ? destx : 0; 6554338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->desty = (desty > 0) ? desty : 0; 6564338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->destw = ((output->destx + destw) > output->screen_width) ? (output->screen_width - output->destx) : destw; 6574338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->desth = ((output->desty + desth) > output->screen_height) ? (output->screen_height - output->desty) : desth; 6584338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang } 6594338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 660ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* Hack for repaint color key to black(0,0,0). */ 66162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->overlay_idle_frame != 0) { 66262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb__information_message("Paint color key to 0x%x\n", driver_data->color_key); 66362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000); 66462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_display(buffer_index); 66562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->overlay_idle_frame = 0; 66654752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 66754752e65b02b1a84c491e3f9c964046faeea306eKun Wang 6685fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang psb__information_message("Overlay position = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth); 6690da1930627209986e8db220799a690f816494401Austin Yuan vaStatus = psb_putsurface_overlay(ctx, surface, 6700da1930627209986e8db220799a690f816494401Austin Yuan srcx, srcy, srcw, srch, 6710da1930627209986e8db220799a690f816494401Austin Yuan output->destx, output->desty, output->destw, output->desth, 6720da1930627209986e8db220799a690f816494401Austin Yuan flags, OVERLAY_A, PIPEA); 6732befccec034c13d34746a9e87149889d59ac767bFei Jiang } 674bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 67509998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (driver_data->overlay_idle_frame == MAX_OVERLAY_IDLE_FRAME) 676cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan psb_coverlay_stop(ctx); 677cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan 678ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->frame_count++; 679ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 68062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 6812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return vaStatus; 682437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 683