Fix external surface issue using new gmm API.
Need to upgrade gmmlib version to 6f15b795e1511febf233b42d7dde603f52fcfdab
diff --git a/media_driver/linux/common/ddi/media_libva_util.cpp b/media_driver/linux/common/ddi/media_libva_util.cpp
index 5421293..8d96393 100755
--- a/media_driver/linux/common/ddi/media_libva_util.cpp
+++ b/media_driver/linux/common/ddi/media_libva_util.cpp
@@ -313,13 +313,8 @@
// Default set as compression not supported, surface compression import only support from Memory Type VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2
bMemCompEnable = false;
bMemCompRC = false;
- pitch = mediaSurface->pSurfDesc->uiPitches[0];
- if (pitch == 0)
- {
- DDI_ASSERTMESSAGE("Invalid pitch value.");
- hRes = VA_STATUS_ERROR_INVALID_PARAMETER;
- goto finish;
- }
+ pitch = mediaSurface->pSurfDesc->uiPitches[0];
+ DDI_CHK_CONDITION(pitch == 0, "Invalid pich.", VA_STATUS_ERROR_INVALID_PARAMETER);
// DRM buffer allocated by Application, No need to re-allocate new DRM buffer
if ((mediaSurface->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM) ||
(mediaSurface->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME))
@@ -485,16 +480,48 @@
}
else
{
+ int32_t baseHeight = 0;
+ DDI_CHK_CONDITION(mediaSurface->pSurfDesc->uiPlanes == 0,
+ "Invalid plane number.",
+ VA_STATUS_ERROR_INVALID_PARAMETER);
+
+ if (mediaSurface->pSurfDesc->uiPlanes == 1)
+ {
+ DDI_CHK_CONDITION(mediaSurface->pSurfDesc->uiSize == 0,
+ "Invalid Size.",
+ VA_STATUS_ERROR_INVALID_PARAMETER);
+ baseHeight = mediaSurface->pSurfDesc->uiSize / pitch;
+ }
+ else
+ {
+ DDI_CHK_CONDITION(mediaSurface->pSurfDesc->uiOffsets[1] == 0,
+ "Invalid offset.",
+ VA_STATUS_ERROR_INVALID_PARAMETER);
+ baseHeight = mediaSurface->pSurfDesc->uiOffsets[1] / pitch;
+ }
// Create GmmResourceInfo
MOS_ZeroMemory(&gmmCustomParams, sizeof(gmmCustomParams));
gmmCustomParams.Type = RESOURCE_2D;
gmmCustomParams.Format = mediaDrvCtx->m_caps->ConvertMediaFmtToGmmFmt(format);
gmmCustomParams.BaseWidth64 = width;
- gmmCustomParams.BaseHeight = height;
+ gmmCustomParams.BaseHeight = baseHeight;
gmmCustomParams.Pitch = pitch;
gmmCustomParams.Size = mediaSurface->pSurfDesc->uiSize;
gmmCustomParams.BaseAlignment = 4096;
gmmCustomParams.NoOfPlanes = mediaSurface->pSurfDesc->uiPlanes;
+ switch (tileformat)
+ {
+ case I915_TILING_Y:
+ gmmCustomParams.Flags.Info.TiledY = true;
+ break;
+ case I915_TILING_X:
+ gmmCustomParams.Flags.Info.TiledX = true;
+ break;
+ case I915_TILING_NONE:
+ default:
+ gmmCustomParams.Flags.Info.Linear = true;
+ }
+
switch(mediaSurface->pSurfDesc->uiPlanes)
{
case 1:
@@ -506,6 +533,8 @@
gmmCustomParams.PlaneOffset.Y[GMM_PLANE_Y] = mediaSurface->pSurfDesc->uiOffsets[0] / pitch;
gmmCustomParams.PlaneOffset.X[GMM_PLANE_U] = 0;
gmmCustomParams.PlaneOffset.Y[GMM_PLANE_U] = mediaSurface->pSurfDesc->uiOffsets[1] / pitch;
+ gmmCustomParams.PlaneOffset.X[GMM_PLANE_V] = 0;
+ gmmCustomParams.PlaneOffset.Y[GMM_PLANE_V] = mediaSurface->pSurfDesc->uiOffsets[1] / pitch;
break;
case 3:
if (mediaSurface->format == Media_Format_YV12)
@@ -548,7 +577,7 @@
mediaSurface->bMapped = false;
mediaSurface->format = format;
mediaSurface->iWidth = width;
- mediaSurface->iHeight = mediaSurface->pSurfDesc->uiOffsets[1] / pitch;
+ mediaSurface->iHeight = gmmResourceInfo->GetBaseHeight();
mediaSurface->iRealHeight = height;
mediaSurface->iPitch = pitch;
mediaSurface->iRefCount = 0;