diff --git a/media_driver/agnostic/common/os/mos_defs.h b/media_driver/agnostic/common/os/mos_defs.h index bcc415e9ee..67b240ea86 100644 --- a/media_driver/agnostic/common/os/mos_defs.h +++ b/media_driver/agnostic/common/os/mos_defs.h @@ -412,7 +412,8 @@ typedef enum _MOS_GPU_CONTEXT MOS_GPU_CONTEXT_VEBOX2 = 13, // Vebox2 MOS_GPU_CONTEXT_COMPUTE = 14, //Compute Context MOS_GPU_CONTEXT_CM_COMPUTE = 15, // MDF Compute - MOS_GPU_CONTEXT_MAX = 16, + MOS_GPU_CONTEXT_BLITTER = 16, + MOS_GPU_CONTEXT_MAX = 17, MOS_GPU_CONTEXT_INVALID_HANDLE = 0xFFFFA } MOS_GPU_CONTEXT, *PMOS_GPU_CONTEXT; diff --git a/media_driver/agnostic/common/vp/hal/media_srcs.cmake b/media_driver/agnostic/common/vp/hal/media_srcs.cmake index 99d7795ce1..fba1aaf502 100644 --- a/media_driver/agnostic/common/vp/hal/media_srcs.cmake +++ b/media_driver/agnostic/common/vp/hal/media_srcs.cmake @@ -28,6 +28,7 @@ set(TMP_SOURCES_ ${CMAKE_CURRENT_LIST_DIR}/vphal_render_ief.cpp ${CMAKE_CURRENT_LIST_DIR}/vphal_render_renderstate.cpp ${CMAKE_CURRENT_LIST_DIR}/vphal_render_sfc_base.cpp + ${CMAKE_CURRENT_LIST_DIR}/vphal_render_blitter.cpp ${CMAKE_CURRENT_LIST_DIR}/vphal_render_vebox_base.cpp ${CMAKE_CURRENT_LIST_DIR}/vphal_render_vebox_iecp.cpp ${CMAKE_CURRENT_LIST_DIR}/vphal_render_vebox_procamp.cpp @@ -49,6 +50,7 @@ set(TMP_HEADERS_ ${CMAKE_CURRENT_LIST_DIR}/vphal_render_ief.h ${CMAKE_CURRENT_LIST_DIR}/vphal_render_renderstate.h ${CMAKE_CURRENT_LIST_DIR}/vphal_render_sfc_base.h + ${CMAKE_CURRENT_LIST_DIR}/vphal_render_blitter.h ${CMAKE_CURRENT_LIST_DIR}/vphal_render_vebox_base.h ${CMAKE_CURRENT_LIST_DIR}/vphal_render_vebox_iecp.h ${CMAKE_CURRENT_LIST_DIR}/vphal_render_vebox_procamp.h diff --git a/media_driver/agnostic/common/vp/hal/vphal.cpp b/media_driver/agnostic/common/vp/hal/vphal.cpp index fb25d28952..7243e6d9bc 100644 --- a/media_driver/agnostic/common/vp/hal/vphal.cpp +++ b/media_driver/agnostic/common/vp/hal/vphal.cpp @@ -126,6 +126,20 @@ MOS_STATUS VphalState::Allocate( MOS_GPU_CONTEXT_VEBOX)); } + { + MOS_GPUCTX_CREATOPTIONS createOption1; + VPHAL_PUBLIC_CHK_STATUS(m_osInterface->pfnCreateGpuContext( + m_osInterface, + MOS_GPU_CONTEXT_BLITTER, + MOS_GPU_NODE_BLITTER, + &createOption1)); + } + + // Register BLITTER GPU context with the event + VPHAL_PUBLIC_CHK_STATUS(m_osInterface->pfnRegisterBBCompleteNotifyEvent( + m_osInterface, + MOS_GPU_CONTEXT_BLITTER)); + // Allocate and initialize HW states RenderHalSettings.iMediaStates = pVpHalSettings->mediaStates; VPHAL_PUBLIC_CHK_STATUS(m_renderHal->pfnInitialize(m_renderHal, &RenderHalSettings)); diff --git a/media_driver/agnostic/common/vp/hal/vphal_common.h b/media_driver/agnostic/common/vp/hal/vphal_common.h index 31ea2b8ff4..38f07d53d2 100644 --- a/media_driver/agnostic/common/vp/hal/vphal_common.h +++ b/media_driver/agnostic/common/vp/hal/vphal_common.h @@ -1076,6 +1076,7 @@ struct VPHAL_RENDER_PARAMS // extension parameters void *pExtensionData; //!< Extension data + bool bBltMode; VPHAL_RENDER_PARAMS() : uSrcCount(0), @@ -1097,7 +1098,8 @@ struct VPHAL_RENDER_PARAMS bTriggerGPUHang(false), #endif bCalculatingAlpha(false), - pExtensionData(nullptr) + pExtensionData(nullptr), + bBltMode(false) { } diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_blitter.cpp b/media_driver/agnostic/common/vp/hal/vphal_render_blitter.cpp new file mode 100644 index 0000000000..94bb762079 --- /dev/null +++ b/media_driver/agnostic/common/vp/hal/vphal_render_blitter.cpp @@ -0,0 +1,125 @@ +#include "vphal_render_blitter.h" +#include +#include "vphal_renderer.h" +#include "vphal_debug.h" + + +VPHAL_BLITTER_STATE::VPHAL_BLITTER_STATE( + PMOS_INTERFACE pOsInterface, + PRENDERHAL_INTERFACE pRenderHal, + PVPHAL_RNDR_PERF_DATA pPerfData, + MOS_STATUS *peStatus + ):RenderState(pOsInterface, pRenderHal, pPerfData, peStatus) +{} + + +VPHAL_BLITTER_STATE::~VPHAL_BLITTER_STATE() +{} + +int VPHAL_BLITTER_STATE::iframe=0; + +MOS_STATUS VPHAL_BLITTER_STATE::Initialize( + const VphalSettings *pSettings, + Kdll_State *pKernelDllState) +{ + MOS_STATUS eStatus; + PRENDERHAL_INTERFACE pRenderHal; + PVPHAL_BLITTER_STATE pBlitterState = this; + + eStatus = MOS_STATUS_SUCCESS; + pRenderHal = pBlitterState->m_pRenderHal; + + if(pRenderHal == nullptr) + { + eStatus = MOS_STATUS_UNKNOWN; + goto finish; + } + + MOS_UNUSED(pSettings); + VPHAL_RENDER_CHK_NULL(pKernelDllState); + + if(m_reporting == nullptr) + { + m_reporting = MOS_New(VphalFeatureReport); + } + + pBlitterState->m_pKernelDllState = pKernelDllState; + +finish: + return eStatus; + +} + +MOS_STATUS VPHAL_BLITTER_STATE::Render( + PCVPHAL_RENDER_PARAMS pcRenderParams, + RenderpassData *pRenderPassData) // RenderpassData isn't used +{ + MOS_STATUS eStatus = MOS_STATUS_SUCCESS; + + PVPHAL_SURFACE pSrcSurface; + PVPHAL_SURFACE pOutputSurface; + PMOS_INTERFACE pOsInterface; + + pSrcSurface = pcRenderParams->pSrc[0]; + pOutputSurface = pcRenderParams->pTarget[0]; + PVPHAL_BLITTER_STATE pBlitterState = this; + pOsInterface = pBlitterState->m_pOsInterface; + + MOS_UNUSED(pcRenderParams); + VPHAL_RENDER_ASSERT(pSrcSurface); + VPHAL_RENDER_ASSERT(pOutputSurface); + + drm_intel_bo_switch(pSrcSurface->OsResource.bo , pOutputSurface->OsResource.bo, pSrcSurface->OsResource.pGmmResInfo->GetBaseHeight() * 3 / 2, pSrcSurface->OsResource.pGmmResInfo->GetRenderPitch()); + + /* The first frame could get good result after waiting a period of time. This will be modified soon.*/ + if (iframe == 0) + { + usleep(10000); //sleep 10ms for the first frame + iframe++; + } + + VpHal_RndrUpdateStatusTableAfterSubmit(pOsInterface, &m_StatusTableUpdateParams, MOS_GPU_CONTEXT_BLITTER, eStatus); + return eStatus; +} + +MOS_STATUS VpHal_RndrRenderBlitter( + VphalRenderer *pRenderer, + PVPHAL_RENDER_PARAMS pRenderParams, + RenderpassData *pRenderPassData) +{ + MOS_STATUS eStatus; + PMOS_INTERFACE pOsInterface; + RenderState *pRenderState; + VphalFeatureReport* pReport; + + + //------------------------------------------------------ + VPHAL_RENDER_ASSERT(pRenderer); + VPHAL_RENDER_ASSERT(pRenderParams); + //------------------------------------------------------ + + eStatus = MOS_STATUS_SUCCESS; + pReport = pRenderer->GetReport(); + pRenderState = pRenderer->pRender[VPHAL_RENDER_ID_BLITTER]; + + + + VPHAL_RENDER_CHK_NULL(pRenderState); + VPHAL_RENDER_ASSERT(pRenderState->GetRenderHalInterface()); + + pRenderer->pRender[VPHAL_RENDER_ID_BLITTER]->SetStatusReportParams(pRenderer, pRenderParams); + + VPHAL_RENDER_CHK_STATUS(pRenderState->Render( + pRenderParams, + pRenderPassData)); + + pRenderState->CopyReporting(pReport); + +finish: + VPHAL_RENDER_NORMALMESSAGE("VPOutputPipe = %d, VEFeatureInUse = %d", + pRenderer->GetReport()->OutputPipeMode, pRenderer->GetReport()->VEFeatureInUse); + + return eStatus; + + +} diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_blitter.h b/media_driver/agnostic/common/vp/hal/vphal_render_blitter.h new file mode 100644 index 0000000000..ff6bb22daa --- /dev/null +++ b/media_driver/agnostic/common/vp/hal/vphal_render_blitter.h @@ -0,0 +1,78 @@ +/*buffer sharing in hal layer for video copy*/ +//! +//! \file vphal_render_blitter.h +//! \brief Common interface and structure used in Blitter +//! \details Common interface and structure used in Blitter which are platform independent +//! + +#ifndef __VPHAL_RENDER_BLITTER_H__ +#define __VPHAL_RENDER_BLITTER_H__ + +#include "vphal_render_renderstate.h" +#include "vphal_common.h" +#include "hal_kerneldll.h" +#include "mos_os.h" + + + + +typedef class VPHAL_BLITTER_STATE *PVPHAL_BLITTER_STATE; + +class VPHAL_BLITTER_STATE : public RenderState +{ + +public: + + Kdll_State *m_pKernelDllState; //!< Kernel DLL state + static int iframe; + + VPHAL_BLITTER_STATE( + PMOS_INTERFACE pOsInterface, + PRENDERHAL_INTERFACE pRenderHal, + PVPHAL_RNDR_PERF_DATA pPerfData, + MOS_STATUS *peStatus + ); + + VPHAL_BLITTER_STATE( const VPHAL_BLITTER_STATE& ) = delete; + VPHAL_BLITTER_STATE& operator=(const VPHAL_BLITTER_STATE&) = delete; + + virtual ~VPHAL_BLITTER_STATE(); + + virtual MOS_STATUS Initialize( + const VphalSettings *pSettings, + Kdll_State *pKernelDllState); + + virtual void Destroy() + {}; + + virtual bool IsNeeded( + PCVPHAL_RENDER_PARAMS pcRenderParams, + RenderpassData *pRenderPassData) + { + + return false; + }; + + + virtual bool IsMultipleStreamSupported() + { + + return false; + }; + + + virtual MOS_STATUS Render( + PCVPHAL_RENDER_PARAMS pcRenderParams, + RenderpassData *pRenderPassData); + +}; + +MOS_STATUS VpHal_RndrRenderBlitter( + VphalRenderer *pRenderer, + PVPHAL_RENDER_PARAMS pRenderParams, + RenderpassData *pRenderPassData); + + +#endif // __VPHAL_RENDER_BLITTER_H__ + + diff --git a/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp b/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp index 6af4548a64..49dfc9e40a 100644 --- a/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp +++ b/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp @@ -23,7 +23,7 @@ //! \file vphal_renderer.cpp //! \brief VPHAL top level rendering component and the entry to low level renderers //! \details The top renderer is responsible for coordinating the sequence of calls to low level renderers, e.g. DNDI or Comp -//! +//i! #include "vphal_renderer.h" #include "vphal_debug.h" #include "vpkrnheader.h" @@ -764,10 +764,20 @@ MOS_STATUS VphalRenderer::RenderSingleStream( VPHAL_RNDR_DUMP_SURF( this, pRenderPassData->uiSrcIndex, VPHAL_DBG_DUMP_TYPE_PRE_DNDI, pRenderPassData->pSrcSurface); - VPHAL_RENDER_CHK_STATUS(VpHal_RndrRenderVebox( - this, - pRenderParams, - pRenderPassData)); + if(pRenderParams->bBltMode == false ) + { + VPHAL_RENDER_CHK_STATUS(VpHal_RndrRenderVebox( + this, + pRenderParams, + pRenderPassData)); + } + else + { + VPHAL_RENDER_CHK_STATUS(VpHal_RndrRenderBlitter( + this, + pRenderParams, + pRenderPassData)); + } if (pRenderPassData->bOutputGenerated) { @@ -1180,6 +1190,10 @@ MOS_STATUS VphalRenderer::Initialize( pSettings, pKernelDllState)); + VPHAL_RENDER_CHK_STATUS(pRender[VPHAL_RENDER_ID_BLITTER]->Initialize( + pSettings, + pKernelDllState)); + AllocateDebugDumper(); if (MEDIA_IS_SKU(m_pSkuTable, FtrVpDisableFor4K)) diff --git a/media_driver/agnostic/common/vp/hal/vphal_renderer.h b/media_driver/agnostic/common/vp/hal/vphal_renderer.h index 798344b6b8..ad8be9e1a4 100644 --- a/media_driver/agnostic/common/vp/hal/vphal_renderer.h +++ b/media_driver/agnostic/common/vp/hal/vphal_renderer.h @@ -32,7 +32,7 @@ #include "vphal_render_common.h" #include "vphal_render_renderstate.h" #include "vphal_render_vebox_base.h" - +#include "vphal_render_blitter.h" #include "vphal_debug.h" #define VPHAL_RNDR_TEMP_OUT_SURFS 2 @@ -101,9 +101,10 @@ enum VPHAL_RENDER_ID VPHAL_RENDER_ID_VEBOX = 0, VPHAL_RENDER_ID_VEBOX2, VPHAL_RENDER_ID_COMPOSITE, + VPHAL_RENDER_ID_BLITTER, VPHAL_RENDER_ID_COUNT //!< Keep this line at the end }; -C_ASSERT(VPHAL_RENDER_ID_COUNT == 3); //!< When adding, update assert +C_ASSERT(VPHAL_RENDER_ID_COUNT == 4); //!< When adding, update assert //! //! \brief VPHAL renderer class diff --git a/media_driver/agnostic/gen9/vp/hal/vphal_renderer_g9.cpp b/media_driver/agnostic/gen9/vp/hal/vphal_renderer_g9.cpp index 9d546a3f8c..e18f30ac19 100644 --- a/media_driver/agnostic/gen9/vp/hal/vphal_renderer_g9.cpp +++ b/media_driver/agnostic/gen9/vp/hal/vphal_renderer_g9.cpp @@ -28,7 +28,7 @@ #include "igvpkrn_g9.h" #include "vphal_render_vebox_g9_base.h" #include "vphal_render_composite_g9.h" - +#include "vphal_render_blitter.h" extern const Kdll_RuleEntry g_KdllRuleTable_g9[]; void VphalRendererG9::GetCacheCntl( @@ -159,6 +159,20 @@ MOS_STATUS VphalRendererG9::AllocateRenderComponents( VPHAL_RENDER_ASSERTMESSAGE("Allocate Composite Render Fail."); return eStatus; } + + pRender[VPHAL_RENDER_ID_BLITTER] = MOS_New( + VPHAL_BLITTER_STATE, + m_pOsInterface, + m_pRenderHal, + &PerfData, + &eStatus); + if (!pRender[VPHAL_RENDER_ID_BLITTER] || + (eStatus != MOS_STATUS_SUCCESS)) + { + eStatus = MOS_STATUS_NO_SPACE; + VPHAL_RENDER_ASSERTMESSAGE("Allocate Blitter Render Fail."); + return eStatus; + } return eStatus; } diff --git a/media_driver/linux/common/ddi/media_libva_util.cpp b/media_driver/linux/common/ddi/media_libva_util.cpp index bd35a3ebd9..16c2820a36 100644 --- a/media_driver/linux/common/ddi/media_libva_util.cpp +++ b/media_driver/linux/common/ddi/media_libva_util.cpp @@ -351,7 +351,7 @@ VAStatus DdiMediaUtil_AllocateSurface( case Media_Format_Y216: case Media_Format_AYUV: case Media_Format_Y410: - case Media_Format_Y416: + case Media_Format_Y416: if (VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER != mediaSurface->surfaceUsageHint) { #if UFO_GRALLOC_NEW_FORMAT @@ -363,6 +363,10 @@ VAStatus DdiMediaUtil_AllocateSurface( #endif } tileformat = I915_TILING_Y; + if (mediaSurface->surfaceUsageHint == 0x00000040) + { + tileformat = I915_TILING_NONE; + } break; case Media_Format_Buffer: tileformat = I915_TILING_NONE; diff --git a/media_driver/linux/common/os/libdrm/include/i915_drm.h b/media_driver/linux/common/os/libdrm/include/i915_drm.h index 28d815ef29..df907a1afc 100644 --- a/media_driver/linux/common/os/libdrm/include/i915_drm.h +++ b/media_driver/linux/common/os/libdrm/include/i915_drm.h @@ -268,6 +268,7 @@ struct drm_i915_cmd_parser_append { #define DRM_I915_GEM_CONTEXT_GETPARAM 0x34 #define DRM_I915_GEM_CONTEXT_SETPARAM 0x35 #define DRM_I915_PERFMON 0x3e +#define DRM_I915_GEM_BO_SWITCH 0x40 #ifndef ANDROID #define DRM_I915_LOAD_BALANCING_HINT 0x3f @@ -329,6 +330,7 @@ struct drm_i915_cmd_parser_append { #define DRM_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_USERPTR, struct drm_i915_gem_userptr) #define DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_GETPARAM, struct drm_i915_gem_context_param) #define DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_SETPARAM, struct drm_i915_gem_context_param) +#define DRM_IOCTL_I915_GEM_BO_SWITCH DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BO_SWITCH, struct drm_i915_bo_switch) #ifndef ANDROID #define DRM_IOCTL_I915_LOAD_BALANCING_HINT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_LOAD_BALANCING_HINT, struct drm_i915_ring_load_query) @@ -1375,4 +1377,12 @@ typedef struct drm_i915_ring_load_query drm_i915_ring_load_info *load_info; } drm_i915_ring_load_query; +struct drm_i915_bo_switch { + __u32 handle_tiled; + __u32 handle_linear; + __u32 flags; + __u32 height; + __u32 width; +}; + #endif /* _I915_DRM_H_ */ diff --git a/media_driver/linux/common/os/libdrm/include/mos_bufmgr.h b/media_driver/linux/common/os/libdrm/include/mos_bufmgr.h index 70fe3dae7f..1eeca8a500 100644 --- a/media_driver/linux/common/os/libdrm/include/mos_bufmgr.h +++ b/media_driver/linux/common/os/libdrm/include/mos_bufmgr.h @@ -311,6 +311,8 @@ int mos_bo_gem_export_to_prime(struct mos_linux_bo *bo, int *prime_fd); struct mos_linux_bo *mos_bo_gem_create_from_prime(struct mos_bufmgr *bufmgr, int prime_fd, int size); +int drm_intel_bo_switch(struct mos_linux_bo *bo_tiled, struct mos_linux_bo *bo_linear, uint32_t height, uint32_t width); + /* drm_intel_bufmgr_fake.c */ struct mos_bufmgr *mos_bufmgr_fake_init(int fd, unsigned long low_offset, diff --git a/media_driver/linux/common/os/libdrm/mos_bufmgr.c b/media_driver/linux/common/os/libdrm/mos_bufmgr.c index 9aea16873a..a08a75479a 100644 --- a/media_driver/linux/common/os/libdrm/mos_bufmgr.c +++ b/media_driver/linux/common/os/libdrm/mos_bufmgr.c @@ -1,7 +1,7 @@ /************************************************************************** * - * Copyright © 2007 Red Hat Inc. - * Copyright © 2007-2018 Intel Corporation + * Copyright ? 2007 Red Hat Inc. + * Copyright ? 2007-2018 Intel Corporation * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA * All Rights Reserved. * @@ -28,7 +28,7 @@ * **************************************************************************/ /* - * Authors: Thomas Hellström + * Authors: Thomas Hellstr?m * Keith Whitwell * Eric Anholt * Dave Airlie @@ -4111,6 +4111,26 @@ mos_bo_gem_export_to_prime(struct mos_linux_bo *bo, int *prime_fd) return 0; } +int drm_intel_bo_switch(struct mos_linux_bo *bo_tiled, struct mos_linux_bo *bo_linear, uint32_t height, uint32_t width) +{ + struct mos_bufmgr_gem *bufmgr_gem_tiled = (struct mos_bufmgr_gem *) bo_tiled->bufmgr; + struct mos_bo_gem *bo_gem_tiled = (struct mos_bo_gem *) bo_tiled; + struct mos_bo_gem *bo_gem_linear = (struct mos_bo_gem *) bo_linear; + struct drm_i915_bo_switch args; + int ret; + + args.handle_tiled = bo_gem_tiled->gem_handle; + args.handle_linear = bo_gem_linear->gem_handle; + args.flags = 0; //will use in later + args.height = height; + args.width = width; + ret = drmIoctl(bufmgr_gem_tiled->fd, DRM_IOCTL_I915_GEM_BO_SWITCH, &args); + if (ret) + return ret; + + return 0; +} + static int mos_gem_bo_flink(struct mos_linux_bo *bo, uint32_t * name) { diff --git a/media_driver/linux/common/os/mos_os_specific.h b/media_driver/linux/common/os/mos_os_specific.h index 4f74572cac..0464b59cf8 100644 --- a/media_driver/linux/common/os/mos_os_specific.h +++ b/media_driver/linux/common/os/mos_os_specific.h @@ -173,7 +173,8 @@ typedef enum _MOS_GPU_NODE MOS_GPU_NODE_VE = I915_EXEC_VEBOX, MOS_GPU_NODE_VIDEO = I915_EXEC_BSD, MOS_GPU_NODE_VIDEO2 = I915_EXEC_VCS2, - MOS_GPU_NODE_MAX = 6,//GFX_MAX(I915_EXEC_RENDER, I915_EXEC_VEBOX, I915_EXEC_BSD, I915_EXEC_VCS2) + 1 + MOS_GPU_NODE_BLITTER = I915_EXEC_BLT, + MOS_GPU_NODE_MAX = 7,//GFX_MAX(I915_EXEC_RENDER, I915_EXEC_VEBOX, I915_EXEC_BSD, I915_EXEC_VCS2) + 1 } MOS_GPU_NODE, *PMOS_GPU_NODE; //! diff --git a/media_driver/linux/common/vp/ddi/media_libva_vp.c b/media_driver/linux/common/vp/ddi/media_libva_vp.c index 0278c50f74..60cae01f4b 100644 --- a/media_driver/linux/common/vp/ddi/media_libva_vp.c +++ b/media_driver/linux/common/vp/ddi/media_libva_vp.c @@ -2837,6 +2837,11 @@ VAStatus DdiVp_EndPicture ( DDI_CHK_NULL(pVpCtx->pVpHalRenderParams, "Null pVpHalRenderParams.", VA_STATUS_ERROR_INVALID_PARAMETER); pVpCtx->pVpHalRenderParams->Component = COMPONENT_VPCommon; + if ((pVpCtx->pVpHalRenderParams->pSrc[0]->OsResource.TileType != MOS_TILE_LINEAR ) && (pVpCtx->pVpHalRenderParams->pTarget[0]->OsResource.TileType == MOS_TILE_LINEAR )&& (pVpCtx->pVpHalRenderParams->pSrc[0]->OsResource.iWidth == pVpCtx->pVpHalRenderParams->pTarget[0]->OsResource.iWidth) && (pVpCtx->pVpHalRenderParams->pSrc[0]->OsResource.iHeight == pVpCtx->pVpHalRenderParams->pTarget[0]->OsResource.iHeight)) + { + pVpCtx->pVpHalRenderParams->bBltMode = true; + } + pVpHal = pVpCtx->pVpHal; DDI_CHK_NULL(pVpHal, "Null pVpHal.", VA_STATUS_ERROR_INVALID_PARAMETER); eStatus = pVpHal->Render(pVpCtx->pVpHalRenderParams);