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, ¢er, &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