10e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
40e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang *
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Zhaohan Ren  <zhaohan.ren@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Shengquan Yuan  <shengquan.yuan@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
310e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <stdio.h>
320e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <math.h>
330e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
340e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <psb_drm.h>
350e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <va/va_backend.h>
360e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <va/va_dricommon.h>
370e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
380e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <wsbm/wsbm_manager.h>
390e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <X11/Xlib.h>
400e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <X11/X.h>
410e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
420e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_drv_video.h"
432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "psb_x11.h"
440e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_output.h"
452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "psb_xrandr.h"
460e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_surface_ext.h"
470e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
480e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_texture.h"
49f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h"
500e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#define INIT_OUTPUT_PRIV    psb_x11_output_p output = (psb_x11_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv)
530e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
540e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
550e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
560e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define IMAGE(id)  ((object_image_p) object_heap_lookup( &driver_data->image_heap, id ))
570e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define SUBPIC(id)  ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id ))
580e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
590e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus psb_extend_dri_init(VADriverContextP ctx, unsigned int destx, unsigned desty, unsigned destw, unsigned desth)
610e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{
620e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    INIT_DRIVER_DATA;
632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    INIT_OUTPUT_PRIV;
640e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int i, ret;
662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    union dri_buffer *extend_dri_buffer;
672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    PPVR2DMEMINFO dri2_bb_export_meminfo;
682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
690e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    struct psb_texture_s *texture_priv = &driver_data->ctexture_priv;
700e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    output->extend_drawable = (Window)psb_xrandr_create_full_screen_window(destx, desty, destw, desth);
724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!output->extend_drawable) {
73c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to create drawable for extend display # %d\n", __func__, output->extend_drawable);
744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
7554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
7654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (texture_priv->extend_dri_drawable) {
773f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        free_drawable(ctx, texture_priv->extend_dri_drawable);
783f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        texture_priv->extend_dri_drawable = NULL;
7954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
8054752e65b02b1a84c491e3f9c964046faeea306eKun Wang
814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    texture_priv->extend_dri_drawable = dri_get_drawable(ctx, output->extend_drawable);
824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!texture_priv->extend_dri_drawable) {
83c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): Failed to get extend_dri_drawable\n", __func__);
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    extend_dri_buffer = dri_get_rendering_buffer(ctx, texture_priv->extend_dri_drawable);
884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!extend_dri_buffer) {
89c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): Failed to get extend_dri_buffer\n", __func__);
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
93bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    ret = PVR2DMemMap(driver_data->hPVR2DContext, 0, (PVR2D_HANDLE)extend_dri_buffer->dri2.name, &dri2_bb_export_meminfo);
944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (ret != PVR2D_OK) {
95c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): PVR2DMemMap failed, ret = %d\n", __func__, ret);
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
982f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memcpy(&texture_priv->extend_dri2_bb_export, dri2_bb_export_meminfo->pBase, sizeof(PVRDRI2BackBuffersExport));
1002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < DRI2_BLIT_BUFFERS_NUM; i++) {
102bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ret = PVR2DMemMap(driver_data->hPVR2DContext, 0, texture_priv->extend_dri2_bb_export.hBuffers[i], &texture_priv->extend_blt_meminfo[i]);
103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ret != PVR2D_OK) {
104c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): PVR2DMemMap failed, ret = %d\n", __func__, ret);
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_UNKNOWN;
106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
1074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
1082f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    texture_priv->extend_dri_init_flag = 1;
1102f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return VA_STATUS_SUCCESS;
1124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
1134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11465174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan/* reset buffer to prevent non-video area distorting when rendering into part of a drawable */
11565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuanstatic void psb_dri_reset_mem(VADriverContextP ctx)
11665174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan{
11765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    INIT_DRIVER_DATA;
11865174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    unsigned int i, size;
11965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    struct dri_drawable *tmp_drawable;
12065174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    struct psb_texture_s *texture_priv = &driver_data->ctexture_priv;
12165174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
1223f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    tmp_drawable = (struct dri_drawable *)texture_priv->dri_drawable;
12365174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    size = tmp_drawable->width * tmp_drawable->height * 4;
12465174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
12565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    if (!tmp_drawable->is_window) {
1263f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        memset(texture_priv->blt_meminfo_pixmap->pBase, 0x0, size);
1273f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        return;
12865174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    } else {
1293f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        if (texture_priv->dri2_bb_export.ui32Type == DRI2_BACK_BUFFER_EXPORT_TYPE_BUFFERS)
1303f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            for (i = 0; i < DRI2_BLIT_BUFFERS_NUM; i++)
1313f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                memset(texture_priv->blt_meminfo[i]->pBase, 0x0, size);
1323f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        if (texture_priv->dri2_bb_export.ui32Type == DRI2_BACK_BUFFER_EXPORT_TYPE_SWAPCHAIN)
1333f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            for (i = 0; i < DRI2_FLIP_BUFFERS_NUM; i++)
1343f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                memset(texture_priv->blt_meminfo[i]->pBase, 0x0, size);
13565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    }
13665174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
13765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    return;
13865174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan}
13965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
1404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus psb_dri_init(VADriverContextP ctx, Drawable draw)
1414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
1424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_DRIVER_DATA;
1434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    union dri_buffer *dri_buffer;
1444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    PPVR2DMEMINFO dri2_bb_export_meminfo;
1454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    struct psb_texture_s *texture_priv = &driver_data->ctexture_priv;
146bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    struct dri_drawable *tmp_drawable;
147bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    int i, ret;
1480e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
14954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    /* free the previous drawable buffer */
15054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (texture_priv->dri_drawable) {
1513f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        free_drawable(ctx, texture_priv->dri_drawable);
1523f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        texture_priv->dri_drawable = NULL;
15354752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
15454752e65b02b1a84c491e3f9c964046faeea306eKun Wang
15554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    texture_priv->dri_drawable = dri_get_drawable(ctx, draw);
1560e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    if (!texture_priv->dri_drawable) {
157c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): Failed to get dri_drawable\n", __func__);
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
1590e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    }
1603f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    tmp_drawable = (struct dri_drawable *)texture_priv->dri_drawable;
1610e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
1622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    dri_buffer = dri_get_rendering_buffer(ctx, texture_priv->dri_drawable);
1632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (!dri_buffer) {
164c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): Failed to get dri_buffer\n", __func__);
165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
1660e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    }
1670e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
1684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* pixmap */
169bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (!tmp_drawable->is_window) {
1703f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        if (texture_priv->blt_meminfo_pixmap)
1713f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            PVR2DMemFree(driver_data->hPVR2DContext, texture_priv->blt_meminfo_pixmap);
17254752e65b02b1a84c491e3f9c964046faeea306eKun Wang
173bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ret = PVR2DMemMap(driver_data->hPVR2DContext, 0, (PVR2D_HANDLE)(dri_buffer->dri2.name & 0x00FFFFFF), &texture_priv->blt_meminfo_pixmap);
174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ret != PVR2D_OK) {
175c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): PVR2DMemMap failed, ret = %d\n", __func__, ret);
176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_UNKNOWN;
177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
1783f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        /* window */
17965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    } else {
1803f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ret = PVR2DMemMap(driver_data->hPVR2DContext, 0, (PVR2D_HANDLE)(dri_buffer->dri2.name & 0x00FFFFFF), &dri2_bb_export_meminfo);
1813f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        if (ret != PVR2D_OK) {
182c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): PVR2DMemMap failed, ret = %d\n", __func__, ret);
18365174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan            return VA_STATUS_ERROR_UNKNOWN;
1843f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        }
18565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
1863f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        memcpy(&texture_priv->dri2_bb_export, dri2_bb_export_meminfo->pBase, sizeof(PVRDRI2BackBuffersExport));
18765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
1883f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        if (texture_priv->dri2_bb_export.ui32Type == DRI2_BACK_BUFFER_EXPORT_TYPE_BUFFERS) {
189c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_dri_init: Now map buffer, DRI2 back buffer export type: DRI2_BACK_BUFFER_EXPORT_TYPE_BUFFERS\n");
19065174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
1913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            for (i = 0; i < DRI2_BLIT_BUFFERS_NUM; i++) {
1923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                ret = PVR2DMemMap(driver_data->hPVR2DContext, 0, texture_priv->dri2_bb_export.hBuffers[i], &texture_priv->blt_meminfo[i]);
1933f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                if (ret != PVR2D_OK) {
194c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): PVR2DMemMap failed, ret = %d\n", __func__, ret);
1953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                    return VA_STATUS_ERROR_UNKNOWN;
1963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                }
1973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            }
1983f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        } else if (texture_priv->dri2_bb_export.ui32Type == DRI2_BACK_BUFFER_EXPORT_TYPE_SWAPCHAIN) {
199c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_dri_init: Now map buffer, DRI2 back buffer export type: DRI2_BACK_BUFFER_EXPORT_TYPE_SWAPCHAIN\n");
20065174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
2013f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            for (i = 0; i < DRI2_FLIP_BUFFERS_NUM; i++) {
2023f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                ret = PVR2DMemMap(driver_data->hPVR2DContext, 0, texture_priv->dri2_bb_export.hBuffers[i], &texture_priv->flip_meminfo[i]);
2033f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                if (ret != PVR2D_OK) {
204c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    drv_debug_msg(VIDEO_DEBUG_ERROR, "%s(): PVR2DMemMap failed, ret = %d\n", __func__, ret);
2053f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                    return VA_STATUS_ERROR_UNKNOWN;
2063f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                }
2073f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            }
2083f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        }
20965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan
2103f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        PVR2DMemFree(driver_data->hPVR2DContext, dri2_bb_export_meminfo);
2110e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    }
2120e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
2130e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    texture_priv->dri_init_flag = 1;
2142f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
21565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    psb_dri_reset_mem(ctx);
2160e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    return VA_STATUS_SUCCESS;
2170e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang}
2180e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
2190e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei JiangVAStatus psb_putsurface_ctexture(
2200e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    VADriverContextP ctx,
2210e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    VASurfaceID surface,
2220e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    Drawable draw,
2230e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    short srcx,
2240e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    short srcy,
2250e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    unsigned short srcw,
2260e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    unsigned short srch,
2270e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    short destx,
2280e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    short desty,
2290e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    unsigned short destw,
2300e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    unsigned short desth,
2310e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    unsigned int flags /* de-interlacing flags */
2320e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang)
2330e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{
2340e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    INIT_DRIVER_DATA;
2352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    INIT_OUTPUT_PRIV;
2362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    int ret;
2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int local_crtc_x, local_crtc_y, extend_crtc_x, extend_crtc_y;
2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int display_width = 0, display_height = 0, extend_display_width = 0, extend_display_height = 0;
2394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int surface_width, surface_height;
2404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_location extend_location = NORMAL;
2414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_extvideo_subtitle subtitle = NOSUBTITLE;
2420e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    object_surface_p obj_surface = SURFACE(surface);
2430e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    psb_surface_p psb_surface;
2444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    Rotation local_rotation, extend_rotation;
2454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_output_device local_device, extend_device;
2464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned short tmp;
2470e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    struct psb_texture_s *texture_priv = &driver_data->ctexture_priv;
248bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    struct dri_drawable *tmp_drawable;
2490e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
2504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2510e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    obj_surface = SURFACE(surface);
252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_surface) {
253c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Invalid surface ID 0x%08x.\n", __func__, surface);
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_INVALID_SURFACE;
2554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2560e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
257ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (driver_data->va_rotate == VA_ROTATION_NONE) {
2584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        psb_surface = obj_surface->psb_surface;
259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        surface_width = obj_surface->width;
260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        surface_height = obj_surface->height;
2614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    } else {
2624d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        psb_surface = obj_surface->out_loop_surface;
263ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        if (driver_data->va_rotate != VA_ROTATION_180) {
2644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            tmp = srcw;
2654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            srcw = srch;
2664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            srch = tmp;
2672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        }
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        surface_width = obj_surface->width_r;
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        surface_height = obj_surface->height_r;
2702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
2712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!psb_surface)
2734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        psb_surface = obj_surface->psb_surface;
2744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (output->output_drawable != draw) {
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        output->output_drawable = draw;
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (texture_priv->dri_init_flag)
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->drawable_update_flag = 1;
2792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
2802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (driver_data->use_xrandr_thread && !driver_data->xrandr_thread_id) {
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ret = psb_xrandr_thread_create(ctx);
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ret != 0) {
284c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to create psb xrandr thread error # %d\n", __func__, ret);
285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_UNKNOWN;
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
2870e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    }
2880e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!texture_priv->dri_init_flag) {
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->destw_save = destw;
291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->desth_save = desth;
2924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    } else {
293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (texture_priv->destw_save != destw || texture_priv->desth_save != desth) {
294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->destw_save = destw;
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->desth_save = desth;
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->drawable_update_flag = 1;
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
2984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2990e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_xrandr_local_crtc_coordinate(&local_device, &local_crtc_x, &local_crtc_y, &display_width, &display_height, &local_rotation);
3014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (ret != VA_STATUS_SUCCESS) {
302c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to get local crtc coordinates error # %d\n", __func__, ret);
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
3044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!psb_xrandr_single_mode() && IS_MFLD(driver_data)) {
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ret = psb_xrandr_extend_crtc_coordinate(&extend_device, &extend_crtc_x, &extend_crtc_y, &extend_display_width, &extend_display_height, &extend_location, &extend_rotation);
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ret != VA_STATUS_SUCCESS) {
309c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to get extend crtc coordinates error # %d\n", __func__, ret);
310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_UNKNOWN;
311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
3124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    //Reinit DRI if screen rotates
3154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (texture_priv->local_rotation_save != local_rotation) {
316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->local_rotation_save = local_rotation;
317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->dri_init_flag = 0;
3184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (texture_priv->extend_rotation_save != extend_rotation) {
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->extend_rotation_save = extend_rotation;
321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->extend_dri_init_flag = 0;
3224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!psb_xrandr_extvideo_mode()) {
325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!texture_priv->dri_init_flag || texture_priv->drawable_update_flag) {
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (texture_priv->drawable_update_flag) {
327c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Drawable update, reinit DRI\n");
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                texture_priv->drawable_update_flag = 0;
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ret = psb_dri_init(ctx, output->output_drawable);
332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ret != VA_STATUS_SUCCESS)
333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return VA_STATUS_ERROR_UNKNOWN;
334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
3354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Extend video */
3384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (psb_xrandr_clone_mode() && local_rotation == extend_rotation) {
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (output->extend_drawable) {
340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            XDestroyWindow(ctx->native_dpy, output->extend_drawable);
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            output->extend_drawable = 0;
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->extend_dri_init_flag = 0;
343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
345c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_ctexture: Clone Mode\n");
3464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    } else if (psb_xrandr_extend_mode()) {
347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (output->extend_drawable) {
348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            XDestroyWindow(ctx->native_dpy, output->extend_drawable);
349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            output->extend_drawable = 0;
350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->extend_dri_init_flag = 0;
351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (extend_location) {
353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case LEFT_OF:
354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            display_height = display_height > extend_display_height ? display_height : extend_display_height;
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (destw > display_width + extend_display_width)
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                destw = display_width + extend_display_width;
357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (desth > display_height)
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                desth = display_height;
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case RIGHT_OF:
361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            display_height = display_height > extend_display_height ? display_height : extend_display_height;
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (destw > display_width + extend_display_width)
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                destw = display_width + extend_display_width;
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (desth > display_height)
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                desth = display_height;
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case BELOW:
368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            display_width = display_width > extend_display_width ? display_width : extend_display_width;
369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (destw > display_width)
370dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                destw = display_width;
371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (desth > display_height + extend_display_height)
372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                desth = display_height + extend_display_height;
373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case ABOVE:
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            display_width = display_width > extend_display_width ? display_width : extend_display_width;
376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (destw > display_width)
377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                destw = display_width;
378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (desth > display_height + extend_display_height)
379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                desth = display_height + extend_display_height;
380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case NORMAL:
382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
386c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_ctexture: Extend Mode, Location: %08x\n", extend_location);
3872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    } else if (psb_xrandr_extvideo_mode()) {
3882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        unsigned int xres, yres, xoffset, yoffset, overscanmode, pannelfitting;
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_extvideo_center center;
3912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_extvideo_prop(&xres, &yres, &xoffset, &yoffset, &center, &subtitle, &overscanmode, &pannelfitting);
3934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        xres = extend_display_width - xoffset;
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        yres = extend_display_height - yoffset;
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        //Init DRI for extend display
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!texture_priv->extend_dri_init_flag) {
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ret = psb_extend_dri_init(ctx, xoffset, yoffset, xres, yres);
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ret != VA_STATUS_SUCCESS)
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return VA_STATUS_ERROR_UNKNOWN;
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
4022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
403c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_ctexture: ExtendVideo Mode, Location: %08x\n", extend_location);
404c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_ctexture: ExtVideo coordinate srcx= %d, srcy=%d, \
4054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo				  srcw=%d, srch=%d, destx=%d, desty=%d, destw=%d, desth=%d, cur_buffer=%d\n",
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 srcx, srcy, srcw, srch, xoffset, yoffset, xres, yres, texture_priv->extend_current_blt_buffer);
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (subtitle == BOTH || subtitle == ONLY_HDMI)
409bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->extend_blt_meminfo[texture_priv->extend_current_blt_buffer], surface, srcx, srcy, srcw, srch, 0, 0,
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       xres, yres, 1,
411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       surface_width, surface_height,
412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
413bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
415bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->extend_blt_meminfo[texture_priv->extend_current_blt_buffer], surface, srcx, srcy, srcw, srch, 0, 0,
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       xres, yres, 0,
417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       surface_width, surface_height,
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
419bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        dri_swap_buffer(ctx, texture_priv->extend_dri_drawable);
422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->extend_current_blt_buffer = (texture_priv->extend_current_blt_buffer + 1) & 0x01;
423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* int this mode, destination retangle may be larger than MIPI resolution, if so setting it to MIPI resolution */
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (destw > display_width)
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            destw = display_width;
427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (desth > display_height)
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            desth = display_height;
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* adjust local window on MIPI, make sure it is not covered by HDMI image */
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!texture_priv->adjust_window_flag) {
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            switch (extend_location) {
433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case ABOVE:
434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                XMoveResizeWindow(ctx->native_dpy, output->output_drawable, 0, extend_display_height, destw, desth);
435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case LEFT_OF:
437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                XMoveResizeWindow(ctx->native_dpy, output->output_drawable, extend_display_width, 0, destw, desth);
438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case BELOW:
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case RIGHT_OF:
441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case NORMAL:
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            default:
443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            XFlush(ctx->native_dpy);
446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->adjust_window_flag = 1;
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!texture_priv->dri_init_flag || texture_priv->drawable_update_flag) {
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (texture_priv->drawable_update_flag) {
451c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Drawable update, reinit DRI\n");
452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                texture_priv->drawable_update_flag = 0;
453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ret = psb_dri_init(ctx, output->output_drawable);
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ret != VA_STATUS_SUCCESS)
457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return VA_STATUS_ERROR_UNKNOWN;
458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
4604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
4614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
4624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Main Video for pixmap*/
4633f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    tmp_drawable = (struct dri_drawable *)texture_priv->dri_drawable;
464bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (!tmp_drawable->is_window) {
465c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_ctexture: Main video Pixmap, coordinate: srcx= %d, srcy=%d, srcw=%d, srch=%d, destx=%d, desty=%d, destw=%d, desth=%d, cur_buffer=%d\n",
466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 srcx, srcy, srcw, srch, destx, desty, destw, desth, texture_priv->current_blt_buffer);
467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (subtitle == BOTH || (subtitle == NOSUBTITLE && obj_surface->subpic_count))
468bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->blt_meminfo_pixmap, surface, srcx, srcy, srcw, srch, destx, desty, destw, desth, 1,
469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       surface_width, surface_height,
470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
471bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
473bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->blt_meminfo_pixmap, surface, srcx, srcy, srcw, srch, destx, desty, destw, desth, 0,
474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       surface_width, surface_height,
475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
476bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_SUCCESS;
4794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
4804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
4814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Main Video for window*/
4822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (texture_priv->dri2_bb_export.ui32Type == DRI2_BACK_BUFFER_EXPORT_TYPE_BUFFERS) {
483c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_ctexture: Main video, swap buffer, coordinate: srcx= %d, srcy=%d, srcw=%d, srch=%d, destx=%d, desty=%d, destw=%d, desth=%d, cur_buffer=%d\n",
484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 srcx, srcy, srcw, srch, destx, desty, destw, desth, texture_priv->current_blt_buffer);
485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (subtitle == BOTH || (subtitle == NOSUBTITLE && obj_surface->subpic_count))
487bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->blt_meminfo[texture_priv->current_blt_buffer], surface, srcx, srcy, srcw, srch, destx, desty, destw, desth, 1,
488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       surface_width, surface_height,
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
490bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
492bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->blt_meminfo[texture_priv->current_blt_buffer], surface, srcx, srcy, srcw, srch, destx, desty, destw, desth, 0,
493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       surface_width, surface_height,
494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
495bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        dri_swap_buffer(ctx, texture_priv->dri_drawable);
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->current_blt_buffer = (texture_priv->current_blt_buffer + 1) & 0x01;
4990e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
5000e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    } else if (texture_priv->dri2_bb_export.ui32Type == DRI2_BACK_BUFFER_EXPORT_TYPE_SWAPCHAIN) {
501c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_ctexture: Main video, flip chain, coordinate: srcx= %d, srcy=%d, srcw=%d, srch=%d, destx=%d, desty=%d, destw=%d, desth=%d, cur_buffer=%d\n",
502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 srcx, srcy, srcw, srch, destx, desty, display_width, display_height, texture_priv->current_blt_buffer);
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (subtitle == BOTH || (subtitle == NOSUBTITLE && obj_surface->subpic_count))
505bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->flip_meminfo[texture_priv->current_blt_buffer], surface, srcx, srcy, srcw, srch, destx, desty,
506dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       display_width, display_height, 1, surface_width, surface_height,
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
508bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
510bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_putsurface_textureblit(ctx, (unsigned char *)texture_priv->flip_meminfo[texture_priv->current_blt_buffer], surface, srcx, srcy, srcw, srch, destx, desty,
511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       display_width, display_height, 0, surface_width, surface_height,
512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_surface->stride, psb_surface->buf.drm_buf,
513bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       psb_surface->buf.pl_flags, 0 /* no wrap for dst */);
514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        dri_swap_buffer(ctx, texture_priv->dri_drawable);
516dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        texture_priv->current_blt_buffer++;
517dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (texture_priv->current_blt_buffer == DRI2_FLIP_BUFFERS_NUM)
518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->current_blt_buffer = 0;
5190e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    }
5200e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang
5210e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang    return VA_STATUS_SUCCESS;
5220e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang}
523