Gmmlib uAPI Implemenetation to accept full comprehensive memory layout description
for the import path for both dmabuf and userptr.
Change-Id: Ie8dbcc740f942511ed8e9441fd453acc84924f78
diff --git a/Source/GmmLib/CMakeLists.txt b/Source/GmmLib/CMakeLists.txt
index cc655be..ee33ca9 100644
--- a/Source/GmmLib/CMakeLists.txt
+++ b/Source/GmmLib/CMakeLists.txt
@@ -25,14 +25,14 @@
# GmmLib Api Version used for so naming
set(GMMLIB_API_MAJOR_VERSION 11)
-set(GMMLIB_API_MINOR_VERSION 1)
+set(GMMLIB_API_MINOR_VERSION 2)
if(NOT DEFINED MAJOR_VERSION)
set(MAJOR_VERSION 11)
endif()
if(NOT DEFINED MINOR_VERSION)
- set(MINOR_VERSION 1)
+ set(MINOR_VERSION 2)
endif()
if(NOT DEFINED PATCH_VERSION)
diff --git a/Source/GmmLib/GlobalInfo/GmmClientContext.cpp b/Source/GmmLib/GlobalInfo/GmmClientContext.cpp
index 592dcbb..60541b0 100644
--- a/Source/GmmLib/GlobalInfo/GmmClientContext.cpp
+++ b/Source/GmmLib/GlobalInfo/GmmClientContext.cpp
@@ -337,6 +337,41 @@
}
/////////////////////////////////////////////////////////////////////////////////////
+/// Member function of ClientContext class for creation of Custiom ResourceInfo Object .
+/// @see GmmLib::GmmResourceInfoCommon::Create()
+///
+/// @param[in] pCreateParams: Flags which specify what sort of resource to create
+/// @return Pointer to GmmResourceInfo class.
+/////////////////////////////////////////////////////////////////////////////////////
+GMM_RESOURCE_INFO *GMM_STDCALL GmmLib::GmmClientContext::CreateCustomResInfoObject(GMM_RESCREATE_CUSTOM_PARAMS *pCreateParams)
+{
+ GMM_RESOURCE_INFO *pRes = NULL;
+ GmmClientContext * pClientContextIn = NULL;
+
+ pClientContextIn = this;
+
+ if((pRes = new GMM_RESOURCE_INFO(pClientContextIn)) == NULL)
+ {
+ GMM_ASSERTDPF(0, "Allocation failed!");
+ goto ERROR_CASE;
+ }
+
+ if(pRes->CreateCustomRes(*pGmmGlobalContext, *pCreateParams) != GMM_SUCCESS)
+ {
+ goto ERROR_CASE;
+ }
+
+ return (pRes);
+
+ERROR_CASE:
+ if(pRes)
+ {
+ DestroyResInfoObject(pRes);
+ }
+
+ return (NULL);
+}
+/////////////////////////////////////////////////////////////////////////////////////
/// Member function of ClientContext class for creation of ResourceInfo Object .
/// @see GmmLib::GmmResourceInfoCommon::Create()
///
diff --git a/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp b/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp
index 727da2d..4a08899 100644
--- a/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp
+++ b/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp
@@ -111,6 +111,126 @@
}
/////////////////////////////////////////////////////////////////////////////////////
+/// Allows clients to "create" Custom memory layout received from the App as user pointer or DMABUF
+// This function does not allocate any memory for the resource. It just calculates/ populates the various parameters
+/// which are useful for the client and can be queried using other functions.
+///
+/// @param[in] GmmLib Context: Reference to ::GmmLibContext
+/// @param[in] CreateParams: Flags which specify what sort of resource to create
+///
+/// @return ::GMM_STATUS
+/////////////////////////////////////////////////////////////////////////////////////
+GMM_STATUS GMM_STDCALL GmmLib::GmmResourceInfoCommon::CreateCustomRes(Context &GmmLibContext, GMM_RESCREATE_CUSTOM_PARAMS &CreateParams)
+{
+ const GMM_PLATFORM_INFO *pPlatform;
+ GMM_STATUS Status = GMM_ERROR;
+ GMM_TEXTURE_CALC * pTextureCalc = NULL;
+ uint32_t BitsPerPixel, i;
+
+
+ GMM_DPF_ENTER;
+
+ __GMM_ASSERTPTR(pGmmGlobalContext, GMM_ERROR);
+ pGmmLibContext = reinterpret_cast<uint64_t>(&GmmLibContext);
+
+
+ if((CreateParams.Format > GMM_FORMAT_INVALID) &&
+ (CreateParams.Format < GMM_RESOURCE_FORMATS))
+ {
+ BitsPerPixel = pGmmGlobalContext->GetPlatformInfo().FormatTable[CreateParams.Format].Element.BitsPer;
+ }
+ else
+ {
+ GMM_ASSERTDPF(0, "Format Error");
+ Status = GMM_INVALIDPARAM;
+ goto ERROR_CASE;
+ }
+
+ pPlatform = GMM_OVERRIDE_PLATFORM_INFO(&Surf);
+ pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf);
+
+ Surf.Type = CreateParams.Type;
+ Surf.Format = CreateParams.Format;
+ Surf.BaseWidth = CreateParams.BaseWidth64;
+ Surf.BaseHeight = CreateParams.BaseHeight;
+ Surf.Flags = CreateParams.Flags;
+ Surf.CachePolicy.Usage = CreateParams.Usage;
+ Surf.Pitch = CreateParams.Pitch;
+ Surf.Size = CreateParams.Size;
+ Surf.Alignment.BaseAlignment = CreateParams.BaseAlignment;
+ Surf.MaxLod = 1;
+ Surf.ArraySize = 1;
+
+#if(_DEBUG || _RELEASE_INTERNAL)
+ Surf.Platform = pGmmGlobalContext->GetPlatformInfo().Platform;
+#endif
+ Surf.BitsPerPixel = BitsPerPixel;
+ Surf.Alignment.QPitch = (GMM_GLOBAL_GFX_SIZE_T)(Surf.Pitch * Surf.BaseHeight);
+
+ pTextureCalc->SetTileMode(&Surf);
+
+ if(GmmIsPlanar(Surf.Format))
+ {
+ if(GMM_IS_TILED(pPlatform->TileInfo[Surf.TileMode]))
+ {
+ Surf.OffsetInfo.Plane.IsTileAlignedPlanes = true;
+ }
+ for(i = 1; i <= CreateParams.NoOfPlanes; i++)
+ {
+ Surf.OffsetInfo.Plane.X[i] = CreateParams.PlaneOffset.X[i];
+ Surf.OffsetInfo.Plane.Y[i] = CreateParams.PlaneOffset.Y[i];
+ }
+ Surf.OffsetInfo.Plane.NoOfPlanes = CreateParams.NoOfPlanes;
+ Surf.OffsetInfo.Plane.ArrayQPitch = Surf.Pitch * Surf.BaseHeight;
+ UpdateUnAlignedParams();
+ }
+
+ switch(Surf.Type)
+ {
+ case RESOURCE_1D:
+ case RESOURCE_2D:
+ case RESOURCE_PRIMARY:
+ case RESOURCE_SHADOW:
+ case RESOURCE_STAGING:
+ case RESOURCE_GDI:
+ case RESOURCE_NNDI:
+ case RESOURCE_HARDWARE_MBM:
+ case RESOURCE_OVERLAY_INTERMEDIATE_SURFACE:
+ case RESOURCE_IFFS_MAPTOGTT:
+#if _WIN32
+ case RESOURCE_WGBOX_ENCODE_DISPLAY:
+ case RESOURCE_WGBOX_ENCODE_REFERENCE:
+#endif
+ {
+ Surf.OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender =
+ Surf.OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock = Surf.Pitch * Surf.BaseHeight;
+ for(i = 0; i <= Surf.MaxLod; i++)
+ {
+ Surf.OffsetInfo.Texture2DOffsetInfo.Offset[i] = 0;
+ }
+
+ break;
+ }
+ default:
+ {
+ GMM_ASSERTDPF(0, "GmmTexAlloc: Unknown surface type!");
+ Status = GMM_INVALIDPARAM;
+ goto ERROR_CASE;
+ ;
+ }
+ };
+
+ GMM_DPF_EXIT;
+ return GMM_SUCCESS;
+
+ERROR_CASE:
+ //Zero out all the members
+ new(this) GmmResourceInfoCommon();
+
+ GMM_DPF_EXIT;
+ return Status;
+}
+/////////////////////////////////////////////////////////////////////////////////////
/// Allows clients to "create" any type of resource. This function does not
/// allocate any memory for the resource. It just calculates the various parameters
/// which are useful for the client and can be queried using other functions.
@@ -367,6 +487,220 @@
return Status;
}
+void GmmLib::GmmResourceInfoCommon::UpdateUnAlignedParams()
+{
+ uint32_t YHeight = 0, VHeight = 0;
+ uint32_t Height = 0, UmdUHeight = 0, UmdVHeight = 0;
+ uint32_t WidthBytesPhysical = GFX_ULONG_CAST(Surf.BaseWidth) * Surf.BitsPerPixel >> 3;
+
+ __GMM_ASSERTPTR(((Surf.TileMode < GMM_TILE_MODES) && (Surf.TileMode >= TILE_NONE)), VOIDRETURN);
+ GMM_DPF_ENTER;
+
+ Height = Surf.BaseHeight;
+
+ switch(Surf.Format)
+ {
+ case GMM_FORMAT_IMC1: // IMC1 = IMC3 with Swapped U/V
+ case GMM_FORMAT_IMC3:
+ case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // UUUU
+ // UUUU
+ // VVVV
+ // VVVV
+ case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // UUUUUUUU
+ // UUUUUUUU
+ // VVVVVVVV
+ // VVVVVVVV
+ {
+ YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
+
+ VHeight = GFX_ALIGN(GFX_CEIL_DIV(Surf.BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
+
+ break;
+ }
+ case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
+ //YYYYYYYY
+ //YYYYYYYY
+ //YYYYYYYY
+ //YYYYYYYY
+ //UUUUUUUU
+ //VVVVVVVV
+ {
+ YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
+
+ VHeight = GFX_ALIGN(GFX_CEIL_DIV(Surf.BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
+
+ break;
+ }
+ case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // UU
+ // UU
+ // UU
+ // UU
+ // VV
+ // VV
+ // VV
+ // VV
+ case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // UUUU
+ // UUUU
+ // UUUU
+ // UUUU
+ // VVVV
+ // VVVV
+ // VVVV
+ // VVVV
+ case GMM_FORMAT_BGRP:
+ case GMM_FORMAT_RGBP:
+ case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // UUUUUUUU
+ // UUUUUUUU
+ // UUUUUUUU
+ // UUUUUUUU
+ // VVVVVVVV
+ // VVVVVVVV
+ // VVVVVVVV
+ // VVVVVVVV
+ {
+ YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
+
+ VHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
+
+ break;
+ }
+ case GMM_FORMAT_IMC2: // IMC2 = IMC4 with Swapped U/V
+ case GMM_FORMAT_IMC4:
+ {
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // UUUUVVVV
+ // UUUUVVVV
+
+ __GMM_ASSERT((Surf.Pitch & 1) == 0);
+
+ YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
+
+ VHeight = GFX_CEIL_DIV(YHeight, 2);
+
+ break;
+ }
+ case GMM_FORMAT_I420: // I420 = IYUV
+ case GMM_FORMAT_IYUV: // I420/IYUV = YV12 with Swapped U/V
+ case GMM_FORMAT_YV12:
+ case GMM_FORMAT_YVU9:
+ {
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // VVVVVV.. <-- V and U planes follow the Y plane, as linear
+ // ..UUUUUU arrays--without respect to pitch.
+
+ uint32_t YSize, YVSizeRShift, VSize, UOffset;
+ uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
+
+ YSize = GFX_ULONG_CAST(Surf.Pitch) * Surf.BaseHeight;
+
+ // YVU9 has one U/V pixel for each 4x4 Y block.
+ // The others have one U/V pixel for each 2x2 Y block.
+
+ // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
+ // The others have a ratio of 4 (2x2 --> 1).
+ YVSizeRShift = (Surf.Format != GMM_FORMAT_YVU9) ? 2 : 4;
+
+ // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
+ // extra/unaligned Y pixels still need corresponding U/V pixels--So
+ // for the purpose of computing the UVSize, we must consider a
+ // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
+ // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
+ YSizeForUVPurposesDimensionalAlignment = (Surf.Format != GMM_FORMAT_YVU9) ? 2 : 4;
+ YSizeForUVPurposes =
+ GFX_ALIGN(GFX_ULONG_CAST(Surf.Pitch), YSizeForUVPurposesDimensionalAlignment) *
+ GFX_ALIGN(Surf.BaseHeight, YSizeForUVPurposesDimensionalAlignment);
+
+ VSize = (YSizeForUVPurposes >> YVSizeRShift);
+
+ YHeight = GFX_CEIL_DIV(YSize + 2 * VSize, WidthBytesPhysical);
+
+ break;
+ }
+ case GMM_FORMAT_NV12:
+ case GMM_FORMAT_NV21:
+ case GMM_FORMAT_NV11:
+ case GMM_FORMAT_P010:
+ case GMM_FORMAT_P012:
+ case GMM_FORMAT_P016:
+ case GMM_FORMAT_P208:
+ {
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // [UV-Packing]
+ YHeight = GFX_ALIGN(Height, __GMM_EVEN_ROW);
+
+ if((Surf.Format == GMM_FORMAT_NV12) ||
+ (Surf.Format == GMM_FORMAT_NV21) ||
+ (Surf.Format == GMM_FORMAT_P010) ||
+ (Surf.Format == GMM_FORMAT_P012) ||
+ (Surf.Format == GMM_FORMAT_P016))
+ {
+ VHeight = GFX_CEIL_DIV(Height, 2);
+ }
+ else
+ {
+ VHeight = YHeight; // U/V plane is same as Y
+ }
+
+ break;
+ }
+ default:
+ {
+ GMM_ASSERTDPF(0, "Unknown Video Format U\n");
+ break;
+ }
+ }
+
+ Surf.OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_Y] = YHeight;
+ if(Surf.OffsetInfo.Plane.NoOfPlanes == 2)
+ {
+ Surf.OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_U] = VHeight;
+ UmdUHeight = (GMM_GLOBAL_GFX_SIZE_T)((Surf.Size / Surf.Pitch) - Surf.OffsetInfo.Plane.Y[GMM_PLANE_U]);
+ }
+ else if(Surf.OffsetInfo.Plane.NoOfPlanes == 3)
+ {
+ Surf.OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_U] =
+ Surf.OffsetInfo.Plane.UnAligned.Height[GMM_PLANE_V] = VHeight;
+ UmdUHeight = (GMM_GLOBAL_GFX_SIZE_T)(Surf.OffsetInfo.Plane.Y[GMM_PLANE_V] - Surf.OffsetInfo.Plane.Y[GMM_PLANE_U]);
+ UmdVHeight = (GMM_GLOBAL_GFX_SIZE_T)(((Surf.Size / Surf.Pitch) - Surf.OffsetInfo.Plane.Y[GMM_PLANE_U]) / 2);
+ __GMM_ASSERTPTR((UmdUHeight == UmdVHeight), VOIDRETURN);
+ }
+
+ __GMM_ASSERTPTR(((Surf.OffsetInfo.Plane.Y[GMM_PLANE_U] == YHeight) && (UmdUHeight == VHeight)), VOIDRETURN);
+}
/////////////////////////////////////////////////////////////////////////////////////
/// This function calculates number of planes required for the given input format
/// and allocates texture info for the respective planes.
diff --git a/Source/GmmLib/ULT/GmmGen11ResourceULT.cpp b/Source/GmmLib/ULT/GmmGen11ResourceULT.cpp
index e4e9fa6..c7fd370 100644
--- a/Source/GmmLib/ULT/GmmGen11ResourceULT.cpp
+++ b/Source/GmmLib/ULT/GmmGen11ResourceULT.cpp
@@ -302,6 +302,85 @@
}
}
+/// @brief ULT for Plannar 2D Resource - RGBP
+TEST_F(CTestGen11Resource, TestPlanar2DCustom_RGBP)
+{
+ /* Test planar surfaces where all planes are full-sized */
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // YYYYYYYY
+ // UUUUUUUU
+ // UUUUUUUU
+ // UUUUUUUU
+ // UUUUUUUU
+ // VVVVVVVV
+ // VVVVVVVV
+ // VVVVVVVV
+ // VVVVVVVV
+ const TEST_TILE_TYPE TileTypes[] = {TEST_LINEAR, TEST_TILEX, TEST_TILEY};
+ const uint32_t PlaneRowAlignment = 16;
+
+ const uint32_t TileSize[3][2] = {{1, 1}, //Linear
+ {512, 8}, // TileX
+ {128, 32}}; // TileY
+ for(uint32_t TileIndex = 0; TileIndex < sizeof(TileTypes) / sizeof(TileTypes[0]); TileIndex++)
+ {
+ TEST_TILE_TYPE Tile = TileTypes[TileIndex];
+
+ GMM_RESCREATE_CUSTOM_PARAMS gmmParams = {};
+ gmmParams.Type = RESOURCE_2D;
+ gmmParams.Flags.Gpu.Texture = 1;
+ gmmParams.BaseWidth64 = 0x101;
+ gmmParams.BaseHeight = GMM_ULT_ALIGN(0x101, PlaneRowAlignment);
+ SetTileFlag_Custom(gmmParams, static_cast<TEST_TILE_TYPE>(Tile));
+ gmmParams.Format = GMM_FORMAT_RGBP;
+
+ uint32_t Pitch, Height;
+
+ Pitch = GMM_ULT_ALIGN(gmmParams.BaseWidth64, GMM_BYTES(64));
+ Height = GMM_ULT_ALIGN(gmmParams.BaseHeight, PlaneRowAlignment /* min16 rows*/) * 3 /*Y, U, V*/;
+
+ uint32_t Size = Pitch * Height;
+ gmmParams.Pitch = Pitch;
+ gmmParams.Size = Size;
+ gmmParams.PlaneOffset.X[GMM_PLANE_Y] = 0;
+ gmmParams.PlaneOffset.Y[GMM_PLANE_Y] = 0;
+ gmmParams.PlaneOffset.X[GMM_PLANE_U] = 0;
+ gmmParams.PlaneOffset.Y[GMM_PLANE_U] = Height / 3;
+ gmmParams.PlaneOffset.X[GMM_PLANE_V] = 0;
+ gmmParams.PlaneOffset.Y[GMM_PLANE_V] = 2 * (Height / 3);
+ gmmParams.NoOfPlanes = 3;
+
+ GMM_RESOURCE_INFO *ResourceInfo;
+ ResourceInfo = pGmmULTClientContext->CreateCustomResInfoObject(&gmmParams);
+
+ VerifyResourcePitch<true>(ResourceInfo, Pitch);
+ if(Tile != TEST_LINEAR)
+ {
+ VerifyResourcePitchInTiles<true>(ResourceInfo, Pitch / TileSize[TileIndex][0]);
+ }
+ VerifyResourceSize<true>(ResourceInfo, Size);
+ VerifyResourceHAlign<false>(ResourceInfo, 0); // Same as any other 2D surface -- tested elsewhere
+ VerifyResourceVAlign<false>(ResourceInfo, 0); // Same as any other 2D surface -- tested elsewhere
+ VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for planar
+
+ // Y plane should be at 0,0
+ EXPECT_EQ(0, ResourceInfo->GetPlanarXOffset(GMM_PLANE_Y));
+ EXPECT_EQ(0, ResourceInfo->GetPlanarYOffset(GMM_PLANE_Y));
+
+ // U plane should be at end of Y plane
+ EXPECT_EQ(0, ResourceInfo->GetPlanarXOffset(GMM_PLANE_U));
+ EXPECT_EQ(Height / 3, ResourceInfo->GetPlanarYOffset(GMM_PLANE_U));
+
+ // V plane should be at end of U plane
+ EXPECT_EQ(0, ResourceInfo->GetPlanarXOffset(GMM_PLANE_V));
+ EXPECT_EQ(2 * (Height / 3), ResourceInfo->GetPlanarYOffset(GMM_PLANE_V));
+
+ pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+ }
+}
+
/// @brief ULT for Plannar 2D Resource - MFX_JPEG_YUV422V , IMC1, IMC3
TEST_F(CTestGen11Resource, TestPlanar2D_MFX_JPEG_YUV422V)
{
diff --git a/Source/GmmLib/ULT/GmmResourceULT.h b/Source/GmmLib/ULT/GmmResourceULT.h
index fb8ddee..e2242f2 100644
--- a/Source/GmmLib/ULT/GmmResourceULT.h
+++ b/Source/GmmLib/ULT/GmmResourceULT.h
@@ -203,6 +203,37 @@
}
}
+ /////////////////////////////////////////////////////////////////////////////////////
+ /// Set the tile flag in Gmm Custom ResCreate Params
+ ///
+ /// @param[in] Parms: Gmm Rescreate params
+ /// @param[in] Tile: Tile Type
+ ///
+ /////////////////////////////////////////////////////////////////////////////////////
+ void SetTileFlag_Custom(GMM_RESCREATE_CUSTOM_PARAMS& Params, TEST_TILE_TYPE Tile)
+ {
+ switch (Tile)
+ {
+ case TEST_LINEAR:
+ Params.Flags.Info.Linear = 1;
+ break;
+ case TEST_TILEX:
+ Params.Flags.Info.TiledX = 1;
+ break;
+ case TEST_TILEY:
+ Params.Flags.Info.TiledY = 1;
+ break;
+ case TEST_TILEYF:
+ Params.Flags.Info.TiledY = 1;
+ Params.Flags.Info.TiledYf = 1;
+ break;
+ case TEST_TILEYS:
+ Params.Flags.Info.TiledY = 1;
+ Params.Flags.Info.TiledYs = 1;
+ break;
+ default: break;
+ }
+ }
/////////////////////////////////////////////////////////////////////////////////////
/// Sets Resource Type in GmmParams
@@ -468,4 +499,4 @@
/// @return Number of tuples in the list
/// @see GmmGen9ResourceULT.cpp
/////////////////////////////////////////////////////////////////////////
-int BuildInputIterator(std::vector<std::tuple<int, int, int, bool, int, int>> &List, int maxTestDimension, int TestArray);
\ No newline at end of file
+int BuildInputIterator(std::vector<std::tuple<int, int, int, bool, int, int>> &List, int maxTestDimension, int TestArray);
diff --git a/Source/GmmLib/inc/External/Common/GmmClientContext.h b/Source/GmmLib/inc/External/Common/GmmClientContext.h
index 525585a..cf3aa9d 100644
--- a/Source/GmmLib/inc/External/Common/GmmClientContext.h
+++ b/Source/GmmLib/inc/External/Common/GmmClientContext.h
@@ -160,6 +160,7 @@
GMM_VIRTUAL void GMM_STDCALL DestroyPageTblMgrObject(GMM_PAGETABLE_MGR* pPageTableMgr,
GmmClientAllocationCallbacks* pAllocCbs);
GMM_VIRTUAL GMM_STATUS GMM_STDCALL GmmSetDeviceInfo(GMM_DEVICE_INFO* DeviceInfo);
+ GMM_VIRTUAL GMM_RESOURCE_INFO* GMM_STDCALL CreateCustomResInfoObject(GMM_RESCREATE_CUSTOM_PARAMS* pCreateParams);
};
}
diff --git a/Source/GmmLib/inc/External/Common/GmmResourceInfoCommon.h b/Source/GmmLib/inc/External/Common/GmmResourceInfoCommon.h
index 0966d89..ce95cf0 100644
--- a/Source/GmmLib/inc/External/Common/GmmResourceInfoCommon.h
+++ b/Source/GmmLib/inc/External/Common/GmmResourceInfoCommon.h
@@ -1634,6 +1634,10 @@
Surf.OffsetInfo.Plane.Y[Plane] = YOffset;
}
+ GMM_VIRTUAL GMM_STATUS GMM_STDCALL CreateCustomRes(Context& GmmLibContext, GMM_RESCREATE_CUSTOM_PARAMS& CreateParams);
+ protected:
+ GMM_VIRTUAL void UpdateUnAlignedParams();
+
};
} // namespace GmmLib
diff --git a/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h b/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h
index 63fbd98..66c7ffe 100644
--- a/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h
+++ b/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h
@@ -288,6 +288,28 @@
} GMM_RESCREATE_PARAMS;
+typedef struct GMM_RESCREATE_CUSTOM_PARAMS__REC
+{
+ GMM_RESOURCE_TYPE Type; // 1D/2D/.../SCRATCH/...
+ GMM_RESOURCE_FORMAT Format; // Pixel format e.g. NV12, GENERIC_8BIT
+ GMM_RESOURCE_FLAG Flags; // See substructure type.
+ GMM_RESOURCE_USAGE_TYPE Usage; // Intended use for this resource. See enumerated type.
+ GMM_GFX_SIZE_T BaseWidth64;
+ uint32_t BaseHeight; // Aligned height of buffer (aligned according to .Format)
+
+ uint32_t Pitch;
+ GMM_GFX_SIZE_T Size;
+ uint32_t BaseAlignment;
+
+ struct
+ {
+ uint32_t X[GMM_MAX_PLANE];
+ uint32_t Y[GMM_MAX_PLANE];
+ }PlaneOffset;
+
+ uint32_t NoOfPlanes;
+}GMM_RESCREATE_CUSTOM_PARAMS;
+
//===========================================================================
// enum :
// GMM_UNIFIED_AUX_TYPE
diff --git a/Source/GmmLib/inc/Internal/Common/Texture/GmmTextureCalc.h b/Source/GmmLib/inc/Internal/Common/Texture/GmmTextureCalc.h
index 421903d..b31a065 100644
--- a/Source/GmmLib/inc/Internal/Common/Texture/GmmTextureCalc.h
+++ b/Source/GmmLib/inc/Internal/Common/Texture/GmmTextureCalc.h
@@ -165,11 +165,10 @@
return 0;
}
- void SetTileMode(GMM_TEXTURE_INFO* pTexInfo);
-
public:
/* Constructors */
// "Creates GmmTextureCalc object based on platform ID"
+ void SetTileMode(GMM_TEXTURE_INFO* pTexInfo);
static GmmTextureCalc* Create(PLATFORM Platform, uint8_t Override);
static void IncrementRefCount()