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 */
31437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <va/va_backend.h>
32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_output.h"
33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h"
34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_buffer.h"
35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_overlay.h"
36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_texture.h"
37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdio.h>
38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h>
39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdarg.h>
40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_android_glue.h"
4165174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan#include "psb_output_android.h"
42b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
4354752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include "psb_HDMIExtMode.h"
44b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
45f91c8768670386683a281cc39141e21bdda9c97fKun Wang#include "pnw_rotate.h"
46c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.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;
7929781ffb2cbf9fb72df9fc538c537690c3dd7cabGuoliang Ji    defaut:
80f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return 0;
81f91c8768670386683a281cc39141e21bdda9c97fKun Wang    }
82f91c8768670386683a281cc39141e21bdda9c97fKun Wang
83f91c8768670386683a281cc39141e21bdda9c97fKun Wang    return 0;
84f91c8768670386683a281cc39141e21bdda9c97fKun Wang}
85f91c8768670386683a281cc39141e21bdda9c97fKun Wang
86e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangunsigned char *psb_android_output_init(VADriverContextP ctx)
87437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
88437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
892befccec034c13d34746a9e87149889d59ac767bFei Jiang    char put_surface[1024];
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;
93437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
942befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output == NULL) {
95c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Can't malloc memory\n");
96ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return NULL;
97437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
980da1930627209986e8db220799a690f816494401Austin Yuan    memset(output, 0, sizeof(psb_android_output_s));
99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1002befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* Guess the screen size */
1012befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = 800;
1022befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = 480;
103437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1042befccec034c13d34746a9e87149889d59ac767bFei Jiang    // Open the frame buffer for reading
1050da1930627209986e8db220799a690f816494401Austin Yuan    memset(&vinfo, 0, sizeof(vinfo));
1062befccec034c13d34746a9e87149889d59ac767bFei Jiang    fbfd = open("/dev/graphics/fb0", O_RDONLY);
1072befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (fbfd) {
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
109c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Error reading screen information.\n");
1102befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
1112befccec034c13d34746a9e87149889d59ac767bFei Jiang    close(fbfd);
1122befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = vinfo.xres;
1132befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = vinfo.yres;
1142f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* TS by default */
116751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    driver_data->output_method = PSB_PUTSURFACE_OVERLAY;
11762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    driver_data->color_key = 0x000001; /*light blue*/
118437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1198803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    if (psb_parse_config("PSB_VIDEO_CTEXTURES", &put_surface[0]) == 0) {
120c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB_VIDEO_CTEXTURES is enabled for vaPutSurfaceBuf\n");
1218803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        driver_data->ctexture = 1; /* Init CTEXTURE for vaPutSurfaceBuf */
1228803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    }
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
124bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) {
125c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Putsurface use client overlay\n");
1262befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY;
12754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
12854752e65b02b1a84c491e3f9c964046faeea306eKun Wang
12906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    driver_data->coverlay = 1;
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
131e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    return (unsigned char *)output;
132437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1342befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx)
135437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
13654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    INIT_DRIVER_DATA;
13765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    INIT_OUTPUT_PRIV;
1382befccec034c13d34746a9e87149889d59ac767bFei Jiang    //psb_android_output_p output = GET_OUTPUT_DATA(ctx);
139850b6d4c015a2f7cd6442199ebee740c1ee0b22fZhu,Tianyang#ifdef TARGET_HAS_MULTIPLE_DISPLAY
140850b6d4c015a2f7cd6442199ebee740c1ee0b22fZhu,Tianyang    if (output->mds != NULL) {
141850b6d4c015a2f7cd6442199ebee740c1ee0b22fZhu,Tianyang        deinit_mds_listener(output);
142850b6d4c015a2f7cd6442199ebee740c1ee0b22fZhu,Tianyang    }
143850b6d4c015a2f7cd6442199ebee740c1ee0b22fZhu,Tianyang#endif
1442befccec034c13d34746a9e87149889d59ac767bFei Jiang    return VA_STATUS_SUCCESS;
145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
146437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
147b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
1482befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture(
149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned char* data,
152437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
153437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
155437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
156437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
157437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
158437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
160cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    unsigned int __maybe_unused flags /* de-interlacing flags */
161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
1642befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
1658bc6a6aa815a18f936036b5a47106b47aa904b1bhding    object_surface_p obj_surface;
1662befccec034c13d34746a9e87149889d59ac767bFei Jiang    int offset = 0;
1672befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface_p psb_surface;
1688bc6a6aa815a18f936036b5a47106b47aa904b1bhding    VAStatus vaStatus = VA_STATUS_SUCCESS;
169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1702befccec034c13d34746a9e87149889d59ac767bFei Jiang    obj_surface = SURFACE(surface);
1718bc6a6aa815a18f936036b5a47106b47aa904b1bhding    CHECK_SURFACE(obj_surface);
1722befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface = obj_surface->psb_surface;
173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
17454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.drm_buf;
17554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.pl_flags;
17654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch,
17754752e65b02b1a84c491e3f9c964046faeea306eKun Wang                               destx, desty, destw, desth, 0, /* no subtitle */
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               obj_surface->width, obj_surface->height,
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_surface->stride, psb_surface->buf.drm_buf,
180bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                               psb_surface->buf.pl_flags, 1 /* need wrap dst */);
1812befccec034c13d34746a9e87149889d59ac767bFei Jiang
1822befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_postBuffer(offset);
18354752e65b02b1a84c491e3f9c964046faeea306eKun Wang
1841f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare    return VA_STATUS_SUCCESS;
185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
186b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
187b7c527a64448cfeedb2fe114b673af667f92faf2hding
188f135e75f6e385876c8007688802e7b38f10a2b7ehding#if 0
1892befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay(
190437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
1962befccec034c13d34746a9e87149889d59ac767bFei Jiang    short destx, /* screen cooridination */
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
2032befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2062befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* USE_FIT_SCR_SIZE */
2072befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* calculate fit screen size of frame */
2082befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_x = output->screen_width;
2092befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_y = output->screen_height;
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    float _slope_xy = (float)srch / srcw;
211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _destw = (short)(_scr_y / _slope_xy);
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _desth = (short)(_scr_x * _slope_xy);
2132befccec034c13d34746a9e87149889d59ac767bFei Jiang    short _pos_x, _pos_y;
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2152befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (_destw <= _scr_x) {
2162befccec034c13d34746a9e87149889d59ac767bFei Jiang        _desth = _scr_y;
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_x = (_scr_x - _destw) >> 1;
2182befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_y = 0;
2192befccec034c13d34746a9e87149889d59ac767bFei Jiang    } else {
2202befccec034c13d34746a9e87149889d59ac767bFei Jiang        _destw = _scr_x;
2212befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_x = 0;
222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_y = (_scr_y - _desth) >> 1;
223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
2242befccec034c13d34746a9e87149889d59ac767bFei Jiang    destx += _pos_x;
2252befccec034c13d34746a9e87149889d59ac767bFei Jiang    desty += _pos_y;
2262befccec034c13d34746a9e87149889d59ac767bFei Jiang    destw = _destw;
2272befccec034c13d34746a9e87149889d59ac767bFei Jiang    desth = _desth;
228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
229c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_overlay: src (%d, %d, %d, %d), destx (%d, %d, %d, %d).\n",
23054752e65b02b1a84c491e3f9c964046faeea306eKun Wang                             srcx, srcy, srcw, srch, destx, desty, destw, desth);
2312befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* display by overlay */
2322befccec034c13d34746a9e87149889d59ac767bFei Jiang    vaStatus = psb_putsurface_overlay(
233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   ctx, surface, srcx, srcy, srcw, srch,
234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   destx, desty, destw, desth, /* screen coordinate */
235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   flags, OVERLAY_A, PIPEA);
236437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2372befccec034c13d34746a9e87149889d59ac767bFei Jiang    return vaStatus;
238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
239f135e75f6e385876c8007688802e7b38f10a2b7ehding#endif
240ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding
241ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#if 0
2420da1930627209986e8db220799a690f816494401Austin Yuanstatic int psb_update_destbox(
2430da1930627209986e8db220799a690f816494401Austin Yuan    VADriverContextP ctx
2440da1930627209986e8db220799a690f816494401Austin Yuan)
2450da1930627209986e8db220799a690f816494401Austin Yuan{
2460da1930627209986e8db220799a690f816494401Austin Yuan    INIT_DRIVER_DATA;
2470da1930627209986e8db220799a690f816494401Austin Yuan    INIT_OUTPUT_PRIV;
2480da1930627209986e8db220799a690f816494401Austin Yuan    short destx;
2490da1930627209986e8db220799a690f816494401Austin Yuan    short desty;
2500da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short destw;
2510da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short desth;
2520da1930627209986e8db220799a690f816494401Austin Yuan    VAStatus vaStatus = VA_STATUS_SUCCESS;
2530da1930627209986e8db220799a690f816494401Austin Yuan
2540da1930627209986e8db220799a690f816494401Austin Yuan    psb_android_get_destbox(&destx, &desty, &destw, &desth);
255c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    /*drv_debug_msg(VIDEO_DEBUG_GENERAL, "destbox = (%d,%d,%d,%d)\n", destx, desty, destw, desth);*/
2560da1930627209986e8db220799a690f816494401Austin Yuan    if ((destx >= 0) && (desty >= 0) &&
2573f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((destx + destw) <= output->screen_width) &&
2583f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((desty + desth) <= output->screen_height) &&
2593f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        (output->destx != destx ||
2603f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->desty != desty ||
2613f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->destw != destw ||
2623f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->desth != desth)) {
2630da1930627209986e8db220799a690f816494401Austin Yuan        output->destx = destx;
2640da1930627209986e8db220799a690f816494401Austin Yuan        output->desty = desty;
2650da1930627209986e8db220799a690f816494401Austin Yuan        output->destw = destw;
2660da1930627209986e8db220799a690f816494401Austin Yuan        output->desth = desth;
2674338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        output->new_destbox = 1;
2680da1930627209986e8db220799a690f816494401Austin Yuan
2690da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("==========New Destbox=============\n");
2700da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("output->destbox = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
2710da1930627209986e8db220799a690f816494401Austin Yuan    }
2720da1930627209986e8db220799a690f816494401Austin Yuan
2730da1930627209986e8db220799a690f816494401Austin Yuan    return vaStatus;
2740da1930627209986e8db220799a690f816494401Austin Yuan}
275ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#endif
276ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
277ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#if 0
278ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuanstatic int psb_check_outputmethod(
279ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
280ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
28188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srcw,
28288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srch,
283ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    void *android_isurface,
2840da1930627209986e8db220799a690f816494401Austin Yuan    psb_hdmi_mode *hdmi_mode
285ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
286ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
287ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
288ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
289ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_HDMIExt_info_p psb_HDMIExt_info = (psb_HDMIExt_info_p)output->psb_HDMIExt_info;
2900da1930627209986e8db220799a690f816494401Austin Yuan    object_surface_p obj_surface;
2915fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    int rotation = 0, widi = 0;
2922d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int delta_rotation = 0;
2932d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int srf_rotate; /* primary surface rotation */
2942d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    psb_surface_p rotate_surface; /* rotate surface */
2952d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int rotate_srf_rotate = -1; /* degree of the rotate surface */
296ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
29788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    if ((srcw >= 2048) || (srch >= 2048)) {
298c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Clip size extend overlay hw limit, use texstreaming\n");
29988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
30088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return 0;
30188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
30288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
303ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use saved status to avoid per-frame checking */
304ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((driver_data->frame_count % driver_data->outputmethod_checkinterval) != 0) {
305ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        *hdmi_mode = psb_HDMIExt_get_mode(output);
306ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return 0;
307ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
308ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
309ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* check the status at outputmethod_checkinterval frequency */
310ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* at first check HDMI status */
311ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (psb_HDMIExt_update(ctx, psb_HDMIExt_info)) {
312c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to update HDMIExt info.\n", __FUNCTION__);
3130da1930627209986e8db220799a690f816494401Austin Yuan        return -1;
314ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
315ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
316f31d5416a60f83e184b0906a7ec77ba021840531hding    obj_surface = SURFACE(surface);
317f31d5416a60f83e184b0906a7ec77ba021840531hding    if (obj_surface == NULL) {
318f31d5416a60f83e184b0906a7ec77ba021840531hding        drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid surface\n");
319f31d5416a60f83e184b0906a7ec77ba021840531hding        return -1;
320f31d5416a60f83e184b0906a7ec77ba021840531hding    }
321f31d5416a60f83e184b0906a7ec77ba021840531hding
322ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    *hdmi_mode = psb_HDMIExt_get_mode(output);
3230a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang    if ((*hdmi_mode == EXTENDED_VIDEO) || (*hdmi_mode == CLONE)) {
324dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        unsigned short _destw, _desth;
325dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        short _pos_x, _pos_y;
326dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        unsigned short crtc_width = 0, crtc_height = 0;
3270a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        float _slope_xy;
3280a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
3290a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        /* need to handle VA rotation, and set WM rotate to 0
3300a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang         * for Android, MIPI0/HDMI has the same WM rotation always
3310a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang         */
332fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        if (driver_data->mipi0_rotation != 0 || driver_data->rotation_dirty != 0) {
3330a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            driver_data->mipi0_rotation = 0;
3340a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            driver_data->hdmi_rotation = 0;
335fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            driver_data->rotation_dirty = 0;
3360a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            output->new_destbox = 1;
337476f382b52ba06226b1ce473b56c388e6718e5e2Jason Hu            psb_RecalcRotate(ctx, CONTEXT(obj_surface->context_id));
3380a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        }
339dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang
340dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        psb_HDMIExt_get_prop(output, &crtc_width, &crtc_height);
341dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang
342dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        /*recalculate the render box to fit the ratio of height/width*/
3430a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        if ((driver_data->extend_rotation == VA_ROTATION_90) ||
3440a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            (driver_data->extend_rotation == VA_ROTATION_270))
3450a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            _slope_xy = (float)srcw / srch;
3460a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        else
3470a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            _slope_xy = (float)srch / srcw;
3480a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
349dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        _destw = (short)(crtc_height / _slope_xy);
350dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        _desth = (short)(crtc_width * _slope_xy);
351dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        if (_destw <= crtc_width) {
352dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _desth = crtc_height;
353dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_x = (crtc_width - _destw) >> 1;
354dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_y = 0;
355dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        } else {
356dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _destw = crtc_width;
357dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_x = 0;
358dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_y = (crtc_height - _desth) >> 1;
359dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        }
360dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.x = _pos_x;
361dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.y = _pos_y;
362dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.width = _destw;
363dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.height = _desth;
364c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "HDMI mode is on (%d), Render Rect: (%d,%d,%d,%d)\n",
3652d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 *hdmi_mode,
366ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.x, driver_data->render_rect.y,
367ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.width, driver_data->render_rect.height);
3680da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
3695fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    }
370ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
371fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* HDMI is not enabled */
372fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    psb_android_surfaceflinger_status(android_isurface, &output->sf_composition, &rotation, &widi);
3734338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*Update output destbox using layerbuffer's visible region*/
3744338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    psb_update_destbox(ctx);
3754338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
3764338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY)
377f91c8768670386683a281cc39141e21bdda9c97fKun Wang        || (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING))
3784338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
3794338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
3804338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*If overlay can not get correct destbox, use texstreaming.*/
381605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang    if (output->destw == 0 || output->desth == 0 ||
382605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        ((output->destw == srcw) && (output->desth == srch))) {
383c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "No proper destbox, use texstreaming (%dx%d+%d+%d)\n",
3842d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 output->destw, output->desth, output->destx, output->desty);
3854338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
3864338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
3874338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    }
3884338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
3890da1930627209986e8db220799a690f816494401Austin Yuan    /* only care local rotation */
3902d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    delta_rotation = Rotation2Angle(driver_data->mipi0_rotation) - Rotation2Angle(rotation);
3912d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    if ((((abs(delta_rotation) == 90) || (abs(delta_rotation) == 270)) && output->new_destbox) ||
3922d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        (abs(delta_rotation) == 180)) {
393c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "New rotation degree %d of MIPI0 WM, Need to recalc rotation\n", rotation);
394f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->mipi0_rotation = rotation;
395f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->hdmi_rotation = rotation;
39635405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang        driver_data->rotation_dirty |= PSB_NEW_WM_ROTATION;
39735405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    }
39835405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    output->new_destbox = 0;
399f91c8768670386683a281cc39141e21bdda9c97fKun Wang
40035405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    if (driver_data->rotation_dirty != 0) {
401476f382b52ba06226b1ce473b56c388e6718e5e2Jason Hu        psb_RecalcRotate(ctx, CONTEXT(obj_surface->context_id));
40235405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang        driver_data->rotation_dirty = 0;
4030da1930627209986e8db220799a690f816494401Austin Yuan    }
4040da1930627209986e8db220799a690f816494401Austin Yuan
4050da1930627209986e8db220799a690f816494401Austin Yuan    if (GET_SURFACE_INFO_protect(obj_surface->psb_surface)) {
406c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Protected surface, use overlay\n");
4070da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
4080da1930627209986e8db220799a690f816494401Austin Yuan
4090da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4100da1930627209986e8db220799a690f816494401Austin Yuan    }
4110da1930627209986e8db220799a690f816494401Austin Yuan
412fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (widi == eWidiClone) {
413c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "WIDI in clone mode, use texstreaming\n");
414fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
415fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */
416fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
417fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 0;
418fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
419fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (widi == eWidiExtendedVideo) {
420c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "WIDI in extend video mode, disable local displaying\n");
421fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->output_method = PSB_PUTSURFACE_NONE;
422fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */
423fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
424fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 0;
425fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
426fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
4270da1930627209986e8db220799a690f816494401Austin Yuan    if (output->sf_composition) {
428c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Composition is detected, use texstreaming\n");
4290da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4300da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4310da1930627209986e8db220799a690f816494401Austin Yuan    }
4320da1930627209986e8db220799a690f816494401Austin Yuan
4332d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    srf_rotate = GET_SURFACE_INFO_rotate(obj_surface->psb_surface);
4344d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    rotate_surface = obj_surface->out_loop_surface;
4352d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    if (rotate_surface != NULL)
4362d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        rotate_srf_rotate = GET_SURFACE_INFO_rotate(rotate_surface);
4370a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
438c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "SF rotation %d, VA rotation %d, final MSVDX rotation %d\n",
4392d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                             rotation, driver_data->va_rotate, driver_data->local_rotation);
440c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Primary surface rotation %d, rotated surface rotation %d\n",
4412d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                             srf_rotate, rotate_srf_rotate);
4422d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang
4432d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    /* The surface rotation is not same with the final rotation */
4440a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang    if ((driver_data->local_rotation != 0) &&
4452d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        ((srf_rotate != driver_data->local_rotation) || (rotate_srf_rotate != driver_data->local_rotation))) {
446c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Use texstreaming due to different VA surface rotation and final rotaion\n",
4472d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 srf_rotate, rotate_srf_rotate);
4482d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4492d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        return 0;
450ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
451ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4520da1930627209986e8db220799a690f816494401Austin Yuan    driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
4530da1930627209986e8db220799a690f816494401Austin Yuan
454ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return 0;
455ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
456ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#endif
457ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4582befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface(
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
461cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    void __maybe_unused * android_isurface,
462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VARectangle *cliprects, /* client supplied clip list */
471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
4732befccec034c13d34746a9e87149889d59ac767bFei Jiang)
474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
4762befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface;
478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
47954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
4806e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    int ret = 0;
481cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan
482b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_surface = SURFACE(surface);
485751400dde1eac64dd41c7de33fcddf8a939e4ab2hding
486751400dde1eac64dd41c7de33fcddf8a939e4ab2hding//    psb__dump_NV_buffers(obj_surface,srcx,srcy,srcw,srch);
4876d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_SURFACE(obj_surface);
4886d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_INVALID_PARAM((NULL == cliprects) && (0 != number_cliprects));
48988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
49054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) ||
4913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) {
492c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "vaPutSurface: source rectangle passed from upper layer is not correct.\n");
49354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        return VA_STATUS_ERROR_UNKNOWN;
49454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
49554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((destx < 0) || (desty < 0)) {
496c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "vaPutSurface: dest rectangle passed from upper layer is not correct.\n");
4973f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
4983f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    }
49954752e65b02b1a84c491e3f9c964046faeea306eKun Wang
5002befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->dummy_putsurface) {
501c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "vaPutSurface: dummy mode, return directly\n");
5022befccec034c13d34746a9e87149889d59ac767bFei Jiang        return VA_STATUS_SUCCESS;
5032befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
5042befccec034c13d34746a9e87149889d59ac767bFei Jiang
5056e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    /* init overlay */
506751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    if (!driver_data->coverlay_init) {
5076e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        ret = psb_coverlay_init(ctx);
5086e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        if (ret != 0) {
509c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "vaPutSurface: psb_coverlay_init failed. Fallback to texture streaming.\n");
5106e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            driver_data->coverlay_init = 0;
5113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        } else
5126e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            driver_data->coverlay_init = 1;
51362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    }
51462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
5155b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    /* set the current displaying video frame into kernel */
5166e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    psb_surface_set_displaying(driver_data, obj_surface->width,
5176e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang                               obj_surface->height_origin,
5186e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang                               obj_surface->psb_surface);
5196e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang
5200da1930627209986e8db220799a690f816494401Austin Yuan    /* local video playback */
521c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "MIPI: Use overlay to display.\n");
52254752e65b02b1a84c491e3f9c964046faeea306eKun Wang
523751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    /*initialize output destbox using default destbox if it has not been initialized until here.*/
524751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    if (output->destw == 0 || output->desth == 0) {
525751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->destx = (destx > 0) ? destx : 0;
526751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->desty = (desty > 0) ? desty : 0;
527751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->destw = ((output->destx + destw) > output->screen_width) ? (output->screen_width - output->destx) : destw;
528751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->desth = ((output->desty + desth) > output->screen_height) ? (output->screen_height - output->desty) : desth;
5292befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
530bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
531c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Overlay position = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
5329769d6a0972207564efb82e397f19ec002841f65Li Zeng    srcw = srcw <= 2047? srcw : 2047;
533751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    vaStatus = psb_putsurface_overlay(ctx, surface,
534751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                      srcx, srcy, srcw, srch,
535751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                      output->destx, output->desty, output->destw, output->desth,
536751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                      flags, OVERLAY_A, PIPEA);
537cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan
538ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    driver_data->frame_count++;
539b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
5402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return vaStatus;
541437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
542