DG1 Upstream

First patch for DG1 Unembargoed

Change-Id: I43b4f47bba2b6c672af920e13bcd58a4c18ac22b
diff --git a/Source/GmmLib/CMakeLists.txt b/Source/GmmLib/CMakeLists.txt
index 2007073..cc655be 100644
--- a/Source/GmmLib/CMakeLists.txt
+++ b/Source/GmmLib/CMakeLists.txt
@@ -177,11 +177,13 @@
 	${BS_DIR_GMMLIB}/CachePolicy/GmmGen10CachePolicy.h
 	${BS_DIR_GMMLIB}/CachePolicy/GmmGen11CachePolicy.h
 	${BS_DIR_GMMLIB}/CachePolicy/GmmGen12CachePolicy.h
+        ${BS_DIR_GMMLIB}/CachePolicy/GmmGen12dGPUCachePolicy.h
 	${BS_DIR_GMMLIB}/CachePolicy/GmmGen8CachePolicy.h
 	${BS_DIR_GMMLIB}/CachePolicy/GmmGen9CachePolicy.h
 	${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen10.h
 	${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen11.h
 	${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen12.h
+        ${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h
 	${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen8.h
 	${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen9.h
 	${BS_DIR_GMMLIB}/inc/External/Common/GmmCachePolicy.h
@@ -243,6 +245,7 @@
   ${BS_DIR_GMMLIB}/CachePolicy/GmmGen10CachePolicy.cpp
   ${BS_DIR_GMMLIB}/CachePolicy/GmmGen11CachePolicy.cpp
   ${BS_DIR_GMMLIB}/CachePolicy/GmmGen12CachePolicy.cpp
+  ${BS_DIR_GMMLIB}/CachePolicy/GmmGen12dGPUCachePolicy.cpp
   ${BS_DIR_GMMLIB}/Platform/GmmGen11Platform.cpp
   ${BS_DIR_GMMLIB}/Platform/GmmGen12Platform.cpp
   ${BS_DIR_GMMLIB}/Platform/GmmGen8Platform.cpp
@@ -286,6 +289,7 @@
 			${BS_DIR_GMMLIB}/CachePolicy/GmmGen10CachePolicy.h
 			${BS_DIR_GMMLIB}/CachePolicy/GmmGen11CachePolicy.h
 			${BS_DIR_GMMLIB}/CachePolicy/GmmGen12CachePolicy.h
+                        ${BS_DIR_GMMLIB}/CachePolicy/GmmGen12dGPUCachePolicy.h
 			${BS_DIR_GMMLIB}/CachePolicy/GmmGen8CachePolicy.h
 			${BS_DIR_GMMLIB}/CachePolicy/GmmGen9CachePolicy.h
 			)
@@ -347,6 +351,7 @@
 			${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen10.h
 			${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen11.h
 			${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen12.h
+                        ${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h
 			${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen8.h
 			${BS_DIR_GMMLIB}/inc/External/Common/CachePolicy/GmmCachePolicyGen9.h
 			)
diff --git a/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp b/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp
new file mode 100644
index 0000000..460bc70
--- /dev/null
+++ b/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp
@@ -0,0 +1,328 @@
+/*==============================================================================
+Copyright(c) 2020 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and / or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+============================================================================*/
+
+
+#include "Internal/Common/GmmLibInc.h"
+#include "External/Common/GmmCachePolicy.h"
+#include "External/Common/CachePolicy/GmmCachePolicyGen10.h"
+#include "External/Common/CachePolicy/GmmCachePolicyGen11.h"
+#include "External/Common/CachePolicy/GmmCachePolicyGen12.h"
+#include "External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h"
+
+//=============================================================================
+//
+// Function: IsSpecialMOCSUsage
+//
+// Desc: This function returns special(hw-reserved) MocsIdx based on usage
+//
+// Parameters: usage  -> Resource usage type
+//             UpdateMOCS  -> True if MOCS Table must be updated, ow false
+//
+// Return: int32_t
+//
+//-----------------------------------------------------------------------------
+int32_t GmmLib::GmmGen12dGPUCachePolicy::IsSpecialMOCSUsage(GMM_RESOURCE_USAGE_TYPE Usage, bool &UpdateMOCS)
+{
+    int32_t MocsIdx = -1;
+    UpdateMOCS      = true;
+
+    switch(Usage)
+    {
+        case GMM_RESOURCE_USAGE_CCS:
+            __GMM_ASSERT(pCachePolicy[Usage].L3 == 0)      //Architecturally, CCS isn't L3-cacheable.
+            MocsIdx = 60;
+            break;
+        case GMM_RESOURCE_USAGE_MOCS_62:
+            __GMM_ASSERT(pCachePolicy[Usage].L3 == 0); //Architecturally, TR/Aux-TT node isn't L3-cacheable.
+            MocsIdx = 62;
+            break;
+        case GMM_RESOURCE_USAGE_L3_EVICTION:
+            MocsIdx = 63;
+            break;
+        case GMM_RESOURCE_USAGE_L3_EVICTION_SPECIAL:
+        case GMM_RESOURCE_USAGE_CCS_MEDIA_WRITABLE:
+            MocsIdx = 61;
+            break;
+        default:
+            UpdateMOCS = false;
+            break;
+    }
+
+    return MocsIdx;
+}
+
+//=============================================================================
+//
+// Function: __GmmGen12dGPUInitCachePolicy
+//
+// Desc: This function initializes the cache policy
+//
+// Parameters: pCachePolicy  -> Ptr to array to be populated with the
+//             mapping of usages -> cache settings.
+//
+// Return: GMM_STATUS
+//
+//-----------------------------------------------------------------------------
+GMM_STATUS GmmLib::GmmGen12dGPUCachePolicy::InitCachePolicy()
+{
+
+    __GMM_ASSERTPTR(pCachePolicy, GMM_ERROR);
+
+#define DEFINE_CACHE_ELEMENT(usage, l3, l3_scc, hdcl1) DEFINE_CP_ELEMENT(usage, 0, 0, l3, 0, 0, 0, 0, l3_scc, 0, 0, 0, hdcl1, 0, 0, 0, 0)
+
+#include "GmmGen12dGPUCachePolicy.h"
+
+#define L3_UNCACHEABLE (0x1)
+#define L3_WB_CACHEABLE (0x3)
+
+#define DISABLE_SKIP_CACHING_CONTROL (0x0)
+#define ENABLE_SKIP_CACHING_CONTROL (0x1)
+
+#define DISABLE_SELF_SNOOP_OVERRIDE (0x0)
+#define CLASS_SERVICE_ZERO (0x0)
+#define GMM_GEN12_MAX_NUMBER_MOCS_INDEXES (60) // On TGL last four (#60-#63) are reserved by h/w, few? are sw configurable though (#60)
+    {
+        SetUpMOCSTable();
+    }
+
+    {
+        // Define index of cache element
+        uint32_t Usage = 0;
+
+#if(_WIN32 && (_DEBUG || _RELEASE_INTERNAL))
+        void *pKmdGmmContext = NULL;
+#if(defined(__GMM_KMD__))
+        pKmdGmmContext = pGmmGlobalContext->GetGmmKmdContext();
+#endif
+
+        OverrideCachePolicy(pKmdGmmContext);
+#endif
+
+        // Process the cache policy and fill in the look up table
+        for(; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
+        {
+            bool                         CachePolicyError = false;
+            bool                         SpecialMOCS      = false;
+            int32_t                      CPTblIdx         = -1;
+            uint32_t                     j                = 0;
+            uint32_t                     PTEValue         = 0;
+            GMM_CACHE_POLICY_TBL_ELEMENT UsageEle         = {0};
+            uint32_t                     StartMocsIdx     = 0;
+
+            switch(GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform))
+            {
+                case IGFX_DG1:
+                    StartMocsIdx = 1; // Index 0 is reserved for Error
+                    break;
+                default:
+                    StartMocsIdx = 1;
+                    break;
+            }
+
+            // No Special MOCS handling for next platform
+            if(GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform) <= IGFX_DG1)
+            {
+                CPTblIdx = IsSpecialMOCSUsage((GMM_RESOURCE_USAGE_TYPE)Usage, SpecialMOCS);
+            }
+
+            // Applicable upto only
+            if(pCachePolicy[Usage].HDCL1 &&
+               (GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform) <= IGFX_DG1))
+            {
+                UsageEle.HDCL1 = 1;
+            }
+
+            UsageEle.L3.Reserved = 0; // Reserved bits zeroe'd, this is so we
+                                      // we can compare the unioned L3.UshortValue.
+            UsageEle.L3.ESC          = DISABLE_SKIP_CACHING_CONTROL;
+            UsageEle.L3.SCC          = 0;
+            UsageEle.L3.Cacheability = pCachePolicy[Usage].L3 ? L3_WB_CACHEABLE : L3_UNCACHEABLE;
+
+            if(pCachePolicy[Usage].L3_SCC)
+            {
+                UsageEle.L3.ESC = ENABLE_SKIP_CACHING_CONTROL;
+                UsageEle.L3.SCC = (uint16_t)pCachePolicy[Usage].L3_SCC;
+            }
+
+            //Special-case MOCS handling for MOCS Table Index 60-63
+            if(CPTblIdx >= GMM_GEN12_MAX_NUMBER_MOCS_INDEXES)
+            {
+                GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmGlobalContext->GetCachePolicyTlbElement()[CPTblIdx];
+
+                if(SpecialMOCS &&
+                   !(TblEle->L3.UshortValue == UsageEle.L3.UshortValue))
+                {
+                    //Assert if being overwritten!
+                    __GMM_ASSERT(TblEle->L3.UshortValue == 0);
+
+                }
+            }
+            //For HDC L1 caching, MOCS Table index 48-59 should be used
+            else if(UsageEle.HDCL1)
+            {
+                for(j = GMM_GEN10_HDCL1_MOCS_INDEX_START; j <= CurrentMaxL1HdcMocsIndex; j++)
+                {
+                    GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmGlobalContext->GetCachePolicyTlbElement()[j];
+                    if(TblEle->L3.UshortValue == UsageEle.L3.UshortValue &&
+                       TblEle->HDCL1 == UsageEle.HDCL1)
+                    {
+                        CPTblIdx = j;
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                for(j = StartMocsIdx; j <= CurrentMaxMocsIndex; j++)
+                {
+                    if(pCachePolicy[Usage].L3 == 0)
+                    {
+                        CPTblIdx = StartMocsIdx;
+                        break;
+                    }
+                    else
+                    {
+                        GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmGlobalContext->GetCachePolicyTlbElement()[j];
+                        if(TblEle->L3.UshortValue == UsageEle.L3.UshortValue)
+                        {
+                            CPTblIdx = j;
+                            break;
+                        }
+                    }
+                }
+            }
+
+            // Didn't find the caching settings in one of the already programmed lookup table entries.
+            // Need to add a new lookup table entry.
+            if(CPTblIdx == -1)
+            {
+
+                {
+                    GMM_ASSERTDPF(false, "CRITICAL ERROR: Cache Policy Usage value specified by Client is not defined in Fixed MOCS Table!");
+
+                    CachePolicyError = true;
+                    GMM_ASSERTDPF(
+                    "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
+                    "(we only support GMM_GEN_MAX_NUMBER_MOCS_INDEXES = %d)",
+                    CurrentMaxMocsIndex);
+
+                    // Set cache policy index to uncached.
+                    CPTblIdx = StartMocsIdx;
+                }
+            }
+
+            // PTE entries do not control caching on SKL+ (for legacy context)
+            if(!GetUsagePTEValue(pCachePolicy[Usage], Usage, &PTEValue))
+            {
+                CachePolicyError = true;
+            }
+
+            pCachePolicy[Usage].PTE.DwordValue = PTEValue;
+
+            pCachePolicy[Usage].MemoryObjectOverride.Gen12.Index = CPTblIdx;
+
+            pCachePolicy[Usage].Override = ALWAYS_OVERRIDE;
+
+            if(CachePolicyError)
+            {
+                GMM_ASSERTDPF("Cache Policy Init Error: Invalid Cache Programming - Element %d", Usage);
+            }
+        }
+    }
+
+    return GMM_SUCCESS;
+}
+
+#pragma optimize("", on)
+//=============================================================================
+//
+// Function: SetUpMOCSTable
+//
+// Desc: For Gen12dGPU, Define new Fixed MOCS table
+//
+// Parameters:
+//
+// Return: GMM_STATUS
+//
+//-----------------------------------------------------------------------------
+void GmmLib::GmmGen12dGPUCachePolicy::SetUpMOCSTable()
+{
+    GMM_CACHE_POLICY_TBL_ELEMENT *pCachePolicyTlbElement = &(pGmmGlobalContext->GetCachePolicyTlbElement()[0]);
+    CurrentMaxL1HdcMocsIndex                             = 0;
+    CurrentMaxSpecialMocsIndex                           = 0;
+
+#define GMM_DEFINE_MOCS(Index, L3_ESC, L3_SCC, L3_CC, _HDCL1)        \
+    {                                                                                  \
+        pCachePolicyTlbElement[Index].L3.ESC            = L3_ESC;                      \
+        pCachePolicyTlbElement[Index].L3.SCC            = L3_SCC;                      \
+        pCachePolicyTlbElement[Index].L3.Cacheability   = L3_CC;                       \
+        pCachePolicyTlbElement[Index].LeCC.Cacheability = 1;                           \
+        pCachePolicyTlbElement[Index].LeCC.TargetCache  = 0;                           \
+        pCachePolicyTlbElement[Index].LeCC.LRUM         = 0;                           \
+        pCachePolicyTlbElement[Index].LeCC.AOM          = 0;                           \
+        pCachePolicyTlbElement[Index].LeCC.ESC          = 0;                           \
+        pCachePolicyTlbElement[Index].LeCC.SCC          = 0;                           \
+        pCachePolicyTlbElement[Index].LeCC.PFM          = 0;                           \
+        pCachePolicyTlbElement[Index].LeCC.SCF          = 0;                           \
+        pCachePolicyTlbElement[Index].LeCC.CoS          = CLASS_SERVICE_ZERO;          \
+        pCachePolicyTlbElement[Index].LeCC.SelfSnoop    = DISABLE_SELF_SNOOP_OVERRIDE; \
+        pCachePolicyTlbElement[Index].HDCL1             = _HDCL1;                      \
+    }
+
+    // clang-format off
+
+    if (GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform) == IGFX_DG1)
+    {
+        //Default MOCS Table
+        for(int index = 0; index < GMM_MAX_NUMBER_MOCS_INDEXES; index++)
+        {     //             Index     ESC	  SCC	  L3CC       HDCL1
+             GMM_DEFINE_MOCS( index  , 0     , 0     , 3     ,        0 )
+        }
+        // Fixed MOCS Table
+        //              Index     ESC	  SCC	  L3CC    HDCL1
+        GMM_DEFINE_MOCS( 0      , 0     , 0     , 1     , 0 )
+        GMM_DEFINE_MOCS( 1      , 0     , 0     , 1     , 0 )
+        GMM_DEFINE_MOCS( 2      , 0     , 0     , 0     , 0 )
+        GMM_DEFINE_MOCS( 3      , 0     , 0     , 0     , 0 )
+        GMM_DEFINE_MOCS( 4      , 0     , 0     , 0     , 0 )
+        GMM_DEFINE_MOCS( 5      , 0     , 0     , 3     , 0 )
+        GMM_DEFINE_MOCS( 6      , 1     , 1     , 3     , 0 )
+        GMM_DEFINE_MOCS( 7      , 1     , 3     , 3     , 0 )
+        GMM_DEFINE_MOCS( 8      , 1     , 7     , 3     , 0 )
+        GMM_DEFINE_MOCS( 48     , 0     , 0     , 3     , 1 )
+        GMM_DEFINE_MOCS( 49     , 0     , 0     , 1     , 1 )
+        GMM_DEFINE_MOCS( 60     , 0     , 0     , 1     , 0 )
+        GMM_DEFINE_MOCS( 61     , 0     , 0     , 1     , 0 )
+        GMM_DEFINE_MOCS( 62     , 0     , 0     , 1     , 0 )
+        GMM_DEFINE_MOCS( 63     , 0     , 0     , 1     , 0 )
+
+        CurrentMaxMocsIndex         = 8;
+        CurrentMaxL1HdcMocsIndex    = 49;
+        CurrentMaxSpecialMocsIndex  = 63;
+
+    }
+
+// clang-format on
+
+
+#undef GMM_DEFINE_MOCS
+}
diff --git a/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.h b/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.h
new file mode 100644
index 0000000..5b242a5
--- /dev/null
+++ b/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.h
@@ -0,0 +1,284 @@
+/*==============================================================================
+Copyright(c) 2020 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and / or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+============================================================================*/
+
+
+#include "GmmCachePolicyConditionals.h"
+
+#define EDRAM (SKU(FtrEDram))
+#define FBLLC (SKU(FtrFrameBufferLLC))
+
+// Cache Policy Definition
+// L3_SCC = L3 skip caching control (disabled if L3_SCC = 0)
+// HDCL1 = HDC L1 cache control (1 = cached in HDC L1, 0 = not cached in HDC L1)
+// Faster PushWrite(Gen10+) used iff !WT, eLLC-only cacheable - Globally visible surface (eg display surface) should be marked WT
+//**************************************************************************************************************************************************/
+//                   USAGE TYPE                                                               , L3 , L3_SCC, HDCL1)
+/***************************************************************************************************************************************************/
+
+// KMD Usages
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_BATCH_BUFFER                                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_COMP_FRAME_BUFFER                                     , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_CONTEXT_SWITCH_BUFFER                                 , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_CURSOR                                                , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DISPLAY_STATIC_IMG_FOR_SMOOTH_ROTATION_BUFFER         , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DUMMY_PAGE                                            , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_GDI_SURFACE                                           , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_GENERIC_KMD_RESOURCE                                  , 0  ,  0   ,    0);
+// GMM_RESOURCE_USAGE_GFX_RING is only used if WaEnableRingHostMapping is enabled.
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_GFX_RING                                              , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_GTT_TRANSFER_REGION                                   , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HW_CONTEXT                                            , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_STATE_MANAGER_KERNEL_STATE                            , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_KMD_STAGING_SURFACE                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MBM_BUFFER                                            , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_NNDI_BUFFER                                           , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OVERLAY_MBM                                           , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PRIMARY_SURFACE                                       , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SCREEN_PROTECTION_INTERMEDIATE_SURFACE                , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SHADOW_SURFACE                                        , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SM_SCRATCH_STATE                                      , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_STATUS_PAGE                                           , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TIMER_PERF_QUEUE                                      , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_UNKNOWN                                               , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_UNMAP_PAGING_RESERVED_GTT_DMA_BUFFER                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VSC_BATCH_BUFFER                                      , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_WA_BATCH_BUFFER                                       , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_KMD_OCA_BUFFER                                        , 0  ,  0   ,    0);
+
+//
+// 3D Usages
+//
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_UMD_BATCH_BUFFER                                      , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_BINDING_TABLE_POOL                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_CCS                                                   , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_CONSTANT_BUFFER_POOL                                  , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DEPTH_BUFFER                                          , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DISPLAYABLE_RENDER_TARGET                             , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_GATHER_POOL                                           , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HEAP_SURFACE_STATE                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HEAP_DYNAMIC_STATE                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HEAP_GENERAL_STATE                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HEAP_GENERAL_STATE_UC                                 , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HEAP_STATELESS_DATA_PORT                              , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HEAP_INDIRECT_OBJECT                                  , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HEAP_INSTRUCTION                                      , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HIZ                                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_INDEX_BUFFER                                          , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_INDEX_BUFFER_L3_COHERENT_UC                           , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_INDEX_BUFFER_L3_CACHED                                , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MCS                                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PUSH_CONSTANT_BUFFER                                  , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PULL_CONSTANT_BUFFER                                  , 1  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_QUERY                                                 , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_RENDER_TARGET                                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SHADER_RESOURCE                                       , 1  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_STAGING                                               , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_STENCIL_BUFFER                                        , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_STREAM_OUTPUT_BUFFER                                  , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILE_POOL                                             , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SHADER_RESOURCE_LLC_BYPASS                            , 1  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MOCS_62                                               , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_L3_EVICTION                                           , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_L3_EVICTION_SPECIAL                                   , 0  ,  0   ,    0);
+
+// Tiled Resource
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_DEPTH_BUFFER                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_HIZ                                             , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_MCS                                             , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_CCS                                             , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_RENDER_TARGET                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_RENDER_TARGET_AND_SHADER_RESOURCE               , 1  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_SHADER_RESOURCE                                 , 1  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILED_UAV                                             , 1  ,  0   ,    0);
+
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_UAV                                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VERTEX_BUFFER                                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VERTEX_BUFFER_L3_COHERENT_UC                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VERTEX_BUFFER_L3_CACHED                               , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OGL_WSTN_VERTEX_BUFFER                                , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_POSH_VERTEX_BUFFER                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_RENDER_TARGET_AND_SHADER_RESOURCE                     , 1  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_WDDM_HISTORY_BUFFER                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_CONTEXT_SAVE_RESTORE                                  , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PTBR_PAGE_POOL                                        , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PTBR_BATCH_BUFFER                                     , 1  ,  0   ,    0);
+
+//
+// CM USAGES
+//
+//                   USAGE TYPE                                                               , L3 , L3_SCC, HDCL1)
+DEFINE_CACHE_ELEMENT(CM_RESOURCE_USAGE_SurfaceState,                                            1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(CM_RESOURCE_USAGE_L1_Enabled_SurfaceState,                                 1  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(CM_RESOURCE_USAGE_StateHeap,                                               1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(CM_RESOURCE_USAGE_NO_L3_SurfaceState,                                      0  ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(CM_RESOURCE_USAGE_NO_CACHE_SurfaceState,                                   0  ,  0   ,    0);
+
+//
+// MP USAGES
+//
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_BEGIN,                                                   0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_DEFAULT,                                                 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_DEFAULT_FF,                                              0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_DEFAULT_RCS,                                             0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_SurfaceState,                                            1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_SurfaceState_FF,                                         0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_SurfaceState_RCS,                                        1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MP_RESOURCE_USAGE_END,                                                     0  ,  0   ,    0);
+
+// MHW - SFC
+DEFINE_CACHE_ELEMENT(MHW_RESOURCE_USAGE_Sfc_CurrentOutputSurface,                               0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MHW_RESOURCE_USAGE_Sfc_AvsLineBufferSurface,                               0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(MHW_RESOURCE_USAGE_Sfc_IefLineBufferSurface,                               0  ,  0   ,    0);
+
+//Media GMM Resource USAGES
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PRE_DEBLOCKING_CODEC                                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_POST_DEBLOCKING_CODEC                                 , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_ORIGINAL_UNCOMPRESSED_PICTURE_ENCODE                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_ORIGINAL_UNCOMPRESSED_PICTURE_DECODE                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_STREAMOUT_DATA_CODEC                                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_INTRA_ROWSTORE_SCRATCH_BUFFER_CODEC                   , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DEBLOCKINGFILTER_ROWSTORE_SCRATCH_BUFFER_CODEC        , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_REFERENCE_PICTURE_CODEC                               , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MACROBLOCK_STATUS_BUFFER_CODEC                        , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MFX_INDIRECT_BITSTREAM_OBJECT_DECODE                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MFX_INDIRECT_MV_OBJECT_CODEC                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MFD_INDIRECT_IT_COEF_OBJECT_DECODE                    , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MFC_INDIRECT_PAKBASE_OBJECT_CODEC                     , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_BSDMPC_ROWSTORE_SCRATCH_BUFFER_CODEC                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MPR_ROWSTORE_SCRATCH_BUFFER_CODEC                     , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_BITPLANE_READ_CODEC                                   , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_AACSBIT_VECTOR_CODEC                                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DIRECTMV_BUFFER_CODEC                                 , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_CURR_ENCODE                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_REF_ENCODE                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE                                , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE                        , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE_FF                     , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE_DST                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE                          , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_BRC_ME_DISTORTION_ENCODE                      , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PAK_OBJECT_ENCODE                                     , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_FLATNESS_CHECK_ENCODE                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_MBENC_CURBE_ENCODE                            , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VDENC_ROW_STORE_BUFFER_CODEC                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VDENC_STREAMIN_CODEC                                  , 0  ,  0   ,    0);
+
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_MD_CODEC                                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_SAO_CODEC                                         , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_MV_CODEC                                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_STATUS_ERROR_CODEC                                , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_LCU_ILDB_STREAMOUT_CODEC                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VP9_PROBABILITY_BUFFER_CODEC                          , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VP9_SEGMENT_ID_BUFFER_CODEC                           , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VP9_HVD_ROWSTORE_BUFFER_CODEC                         , 0  ,  0   ,    0);
+
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MACROBLOCK_ILDB_STREAM_OUT_BUFFER_CODEC               , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SSE_SRC_PIXEL_ROW_STORE_BUFFER_CODEC                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SLICE_STATE_STREAM_OUT_BUFFER_CODEC                   , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_CABAC_SYNTAX_STREAM_OUT_BUFFER_CODEC                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PRED_COL_STORE_BUFFER_CODEC                           , 0  ,  0   ,    0);
+
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_UNCACHED                                      , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ELLC_ONLY                                     , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ELLC_LLC_ONLY                                 , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ELLC_LLC_L3                                   , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_CCS_MEDIA_WRITABLE                                    , 0  ,  0   ,    0);
+
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_BRC_HISTORY_ENCODE                            , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_SOFTWARE_SCOREBOARD_ENCODE                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ME_MV_DATA_ENCODE                             , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_MV_DISTORTION_ENCODE                          , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_4XME_DISTORTION_ENCODE                        , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_INTRA_DISTORTION_ENCODE                       , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MB_STATS_ENCODE                                       , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_PAK_STATS_ENCODE                              , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_PIC_STATE_READ_ENCODE                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_PIC_STATE_WRITE_ENCODE                        , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_COMBINED_ENC_ENCODE                           , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_BRC_CONSTANT_DATA_ENCODE                      , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_INTERMEDIATE_CU_RECORD_SURFACE_ENCODE         , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_SCRATCH_ENCODE                                , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_LCU_LEVEL_DATA_ENCODE                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_HISTORY_INPUT_ENCODE                      , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_HISTORY_OUTPUT_ENCODE                     , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_DEBUG_ENCODE                                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_CONSTANT_TABLE_ENCODE                     , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_CU_RECORD_ENCODE                          , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_MV_TEMPORAL_BUFFER_ENCODE                 , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_CU_PACKET_FOR_PAK_ENCODE                  , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_BCOMBINED1_ENCODE                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ENC_BCOMBINED2_ENCODE                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_FRAME_STATS_STREAMOUT_DATA_CODEC                      , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DEBLOCKINGFILTER_ROWSTORE_TILE_LINE_BUFFER_CODEC      , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_DEBLOCKINGFILTER_ROWSTORE_TILE_COLUMN_BUFFER_CODEC    , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_MD_TILE_LINE_CODEC                                , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_MD_TILE_COLUMN_CODEC                              , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_SAO_TILE_LINE_CODEC                               , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HCP_SAO_TILE_COLUMN_CODEC                             , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_VP9_PROBABILITY_COUNTER_BUFFER_CODEC                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_HUC_VIRTUAL_ADDR_REGION_BUFFER_CODEC                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SIZE_STREAMOUT_CODEC                                  , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_COMPRESSED_HEADER_BUFFER_CODEC                        , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PROBABILITY_DELTA_BUFFER_CODEC                        , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILE_RECORD_BUFFER_CODEC                              , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_TILE_SIZE_STAS_BUFFER_CODEC                           , 0  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_MAD_ENCODE                                    , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_PAK_IMAGESTATE_ENCODE                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_MBENC_BRC_ENCODE                              , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_MB_BRC_CONST_ENCODE                           , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_BRC_MB_QP_ENCODE                              , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_BRC_ROI_ENCODE                                , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_MBDISABLE_SKIPMAP_CODEC                               , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_SLICE_MAP_ENCODE                              , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_WP_DOWNSAMPLED_ENCODE                         , 1  ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_VDENC_IMAGESTATE_ENCODE                       , 0  ,  0   ,    0);
+
+/**********************************************************************************/
+
+//
+// OCL Usages
+//
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_BUFFER                                            , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_BUFFER_CONST                                      , 1 ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_BUFFER_CSR_UC                                     , 0 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_BUFFER_CACHELINE_MISALIGNED                       , 0 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_IMAGE                                             , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_INLINE_CONST                                      , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_INLINE_CONST_HDC                                  , 1 ,  0   ,    1);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_SCRATCH                                           , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_PRIVATE_MEM                                       , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_PRINTF_BUFFER                                     , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_STATE_HEAP_BUFFER                                 , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_SYSTEM_MEMORY_BUFFER                              , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_SYSTEM_MEMORY_BUFFER_CACHELINE_MISALIGNED         , 0 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_ISH_HEAP_BUFFER                                   , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_TAG_MEMORY_BUFFER                                 , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_TEXTURE_BUFFER                                    , 1 ,  0   ,    0);
+DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_OCL_SELF_SNOOP_BUFFER                                 , 1 ,  0   ,    0);
+/**********************************************************************************/
+
+// Cross Adapter
+DEFINE_CACHE_ELEMENT( GMM_RESOURCE_USAGE_XADAPTER_SHARED_RESOURCE                             , 0  ,  0   ,    0);
+/**********************************************************************************/
+
+#include "GmmCachePolicyUndefineConditionals.h"
+
diff --git a/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp b/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp
index a2fbd4e..1cc87d3 100644
--- a/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp
+++ b/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp
@@ -52,6 +52,20 @@
         Ignore64KBPadding = true;
     }
 
+    if(pGmmGlobalContext->GetSkuTable().FtrLocalMemory)
+    {
+        Ignore64KBPadding |= (Surf.Flags.Info.NonLocalOnly || (Surf.Flags.Info.Shared && !Surf.Flags.Info.NotLockable));
+    }
+    else
+    {
+        // The final padded size cannot be larger then a set percentage of the original size
+        if((Surf.Flags.Info.NoOptimizationPadding && !GFX_IS_ALIGNED(Size, GMM_KBYTE(64))) /*Surface is not 64kb aligned*/ ||
+           (!Surf.Flags.Info.NoOptimizationPadding && (((Size * (100 + pGmmGlobalContext->GetAllowedPaddingFor64KbPagesPercentage())) / 100) < GFX_ALIGN(Size, GMM_KBYTE(64)))) /*10% padding TBC */)
+        {
+            Ignore64KBPadding |= true;
+        }
+    }
+
     // If 64KB paging is enabled pad out the resource to 64KB alignment
     if(pGmmGlobalContext->GetSkuTable().FtrWddm2_1_64kbPages &&
        // Ignore the padding for the above VirtualPadding or ESM cases
@@ -62,13 +76,7 @@
         (Surf.Alignment.BaseAlignment == GMM_KBYTE(32)) ||
         (Surf.Alignment.BaseAlignment == GMM_KBYTE(16)) ||
         (Surf.Alignment.BaseAlignment == GMM_KBYTE(8)) ||
-        (Surf.Alignment.BaseAlignment == GMM_KBYTE(4))) &&
-       // The final padded size cannot be larger then a set percentage of the original size
-       ((!Surf.Flags.Info.NoOptimizationPadding &&
-         ((Size * (100 + pGmmGlobalContext->GetAllowedPaddingFor64KbPagesPercentage())) / 100) >= GFX_ALIGN(Size, GMM_KBYTE(64))) ||
-        (Surf.Flags.Info.NoOptimizationPadding && GFX_IS_ALIGNED(Size, GMM_KBYTE(64))))
-
-       )
+        (Surf.Alignment.BaseAlignment == GMM_KBYTE(4))))
     {
         return 1;
     }
@@ -336,6 +344,11 @@
         }
     }
 
+    if(Is64KBPageSuitable() && pGmmGlobalContext->GetSkuTable().FtrLocalMemory)
+    {
+        Surf.Alignment.BaseAlignment = GMM_KBYTE(64);
+    }
+
     GMM_DPF_EXIT;
     return GMM_SUCCESS;
 
diff --git a/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp b/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp
index 8020f53..afe33c3 100644
--- a/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp
+++ b/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp
@@ -347,6 +347,57 @@
         goto ERROR_CASE;
     }
 
+
+    if(pGmmGlobalContext->GetSkuTable().FtrLocalMemory)
+    {
+        GMM_ASSERTDPF(((Surf.Flags.Info.NonLocalOnly && Surf.Flags.Info.LocalOnly) == 0),
+                      "Incorrect segment preference, cannot be both local and system memory.");
+
+        if(Surf.Flags.Gpu.Overlay ||
+           Surf.Flags.Gpu.FlipChain)
+        {
+            if(Surf.Flags.Info.NonLocalOnly)
+            {
+                GMM_ASSERTDPF(0, "Overlay and FlipChain cannot be in system memory.");
+                goto ERROR_CASE;
+            }
+            Surf.Flags.Info.LocalOnly    = 1;
+            Surf.Flags.Info.NonLocalOnly = 0;
+        }
+
+        if(!Surf.Flags.Info.NotLockable &&
+           Surf.Flags.Info.Shared)
+        {
+            if(Surf.Flags.Info.LocalOnly)
+            {
+                GMM_ASSERTDPF(0, "Lockable Shared cannot be in local memory.");
+                goto ERROR_CASE;
+            }
+            Surf.Flags.Info.LocalOnly    = 0;
+            Surf.Flags.Info.NonLocalOnly = 1;
+        }
+
+        if(Surf.Flags.Gpu.CameraCapture)
+        {
+            if(Surf.Flags.Info.LocalOnly)
+            {
+                GMM_ASSERTDPF(0, "CameraCapture cannot be in local memory.");
+            }
+            Surf.Flags.Info.LocalOnly    = 0;
+            Surf.Flags.Info.NonLocalOnly = 1;
+        }
+
+        if(!Surf.Flags.Info.NonLocalOnly &&
+           (!pGmmGlobalContext->GetSkuTable().FtrLocalMemoryAllows4KB))
+        {
+            Surf.Flags.Info.LocalOnly = true;
+        }
+    }
+    else
+    {
+        Surf.Flags.Info.LocalOnly = false; //Zero out on iGPU
+    }
+
     if((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) < IGFX_GEN8_CORE) &&
        Surf.Flags.Info.TiledW)
     {
diff --git a/Source/GmmLib/ULT/CMakeLists.txt b/Source/GmmLib/ULT/CMakeLists.txt
index e5c2f21..bc9b093 100644
--- a/Source/GmmLib/ULT/CMakeLists.txt
+++ b/Source/GmmLib/ULT/CMakeLists.txt
@@ -28,7 +28,9 @@
      GmmGen11CachePolicyULT.h
      GmmGen11ResourceULT.h
      GmmGen12ResourceULT.h
+     GmmGen12dGPUResourceULT.h
      GmmGen12CachePolicyULT.h
+     GmmGen12dGPUCachePolicyULT.h
      GmmGen9CachePolicyULT.h
      GmmGen9ResourceULT.h
      GmmResourceULT.h
@@ -44,8 +46,10 @@
     GmmGen10ResourceULT.cpp
     GmmGen11CachePolicyULT.cpp
     GmmGen12CachePolicyULT.cpp
+    GmmGen12dGPUCachePolicyULT.cpp
     GmmGen11ResourceULT.cpp
     GmmGen12ResourceULT.cpp
+    GmmGen12dGPUResourceULT.cpp
     GmmGen9CachePolicyULT.cpp
     GmmGen9ResourceULT.cpp
     GmmResourceCpuBltULT.cpp
@@ -61,13 +65,14 @@
             GmmGen10CachePolicyULT.cpp
             GmmGen11CachePolicyULT.cpp
             GmmGen12CachePolicyULT.cpp
+            GmmGen12dGPUCachePolicyULT.cpp
             )
 
 source_group("Source Files\\Resource" FILES
             GmmGen10ResourceULT.cpp
             GmmGen11ResourceULT.cpp
             GmmGen12ResourceULT.cpp
-
+            GmmGen12dGPUResourceULT.cpp
             GmmGen9ResourceULT.cpp
             GmmResourceCpuBltULT.cpp
             GmmResourceULT.cpp
@@ -86,6 +91,7 @@
              GmmGen10CachePolicyULT.h
              GmmGen11CachePolicyULT.h
              GmmGen12CachePolicyULT.h
+             GmmGen12dGPUCachePolicyULT.h
              GmmGen9CachePolicyULT.h
             )
 
@@ -93,6 +99,7 @@
              GmmGen10ResourceULT.h
              GmmGen11ResourceULT.h
              GmmGen12ResourceULT.h
+             GmmGen12dGPUResourceULT.h
              GmmGen9ResourceULT.h
              GmmResourceULT.h
             )
diff --git a/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.cpp b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.cpp
new file mode 100644
index 0000000..a19b76c
--- /dev/null
+++ b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.cpp
@@ -0,0 +1,167 @@
+/*==============================================================================
+Copyright(c) 2020 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and / or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+============================================================================*/
+
+#include "GmmGen12dGPUCachePolicyULT.h"
+
+using namespace std;
+
+/////////////////////////////////////////////////////////////////////////////////////
+/// Sets up common environment for Cache Policy fixture tests. this is called once per
+/// test case before executing all tests under resource fixture test case.
+/// It also calls SetupTestCase from CommonULT to initialize global context and others.
+///
+/////////////////////////////////////////////////////////////////////////////////////
+void CTestGen12dGPUCachePolicy::SetUpTestCase()
+{
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
+/// cleans up once all the tests finish execution.  It also calls TearDownTestCase
+/// from CommonULT to destroy global context and others.
+///
+/////////////////////////////////////////////////////////////////////////////////////
+void CTestGen12dGPUCachePolicy::TearDownTestCase()
+{
+}
+
+void CTestGen12dGPUCachePolicy::SetUpGen12dGPUVariant(PRODUCT_FAMILY platform)
+{
+    printf("%s\n", __FUNCTION__);
+
+    GfxPlatform.eProductFamily = platform;
+
+    GfxPlatform.eRenderCoreFamily = IGFX_GEN12_CORE;
+
+    pGfxAdapterInfo = (ADAPTER_INFO *)malloc(sizeof(ADAPTER_INFO));
+    if(pGfxAdapterInfo)
+    {
+        memset(pGfxAdapterInfo, 0, sizeof(ADAPTER_INFO));
+
+        pGfxAdapterInfo->SkuTable.FtrLinearCCS             = 1; //legacy y =>0 - test both
+        pGfxAdapterInfo->SkuTable.FtrStandardMipTailFormat = 1;
+        pGfxAdapterInfo->SkuTable.FtrTileY                 = 1;
+        pGfxAdapterInfo->SkuTable.FtrLocalMemory           = 1;
+        CommonULT::SetUpTestCase();
+    }
+}
+
+void CTestGen12dGPUCachePolicy::TearDownGen12dGPUVariant()
+{
+    printf("%s\n", __FUNCTION__);
+
+    CommonULT::TearDownTestCase();
+}
+
+TEST_F(CTestGen12dGPUCachePolicy, TestGen12dGPU_DG1CachePolicy)
+{
+    SetUpGen12dGPUVariant(IGFX_DG1);
+
+    CheckL3Gen12dGPUCachePolicy();
+
+    TearDownGen12dGPUVariant();
+}
+
+void CTestGen12dGPUCachePolicy::CheckSpecialMocs(uint32_t                    Usage,
+                                               uint32_t                    AssignedMocsIdx,
+                                               GMM_CACHE_POLICY_ELEMENT ClientRequest)
+{
+    if(Usage == GMM_RESOURCE_USAGE_CCS) //60
+    {
+        EXPECT_EQ(AssignedMocsIdx, 60) << "Usage# " << Usage << ": Incorrect Index for CCS";
+        EXPECT_EQ(0, ClientRequest.L3) << "Usage# " << Usage << ": Incorrect L3 cacheability for CCS";
+    }
+    else if(Usage == GMM_RESOURCE_USAGE_CCS_MEDIA_WRITABLE) // 61
+    {
+        EXPECT_EQ(AssignedMocsIdx, 61) << "Usage# " << Usage << ": Incorrect Index for CCS";
+        EXPECT_EQ(0, ClientRequest.L3) << "Usage# " << Usage << ": Incorrect L3 cacheability for CCS";
+    }
+    else if(Usage == GMM_RESOURCE_USAGE_MOCS_62) //62
+    {
+        EXPECT_EQ(AssignedMocsIdx, 62) << "Usage# " << Usage << ": Incorrect Index for MOCS_62";
+        EXPECT_EQ(0, ClientRequest.L3) << "Usage# " << Usage << ": Incorrect L3 cacheability for MOCS#62";
+    }
+}
+
+void CTestGen12dGPUCachePolicy::CheckMocsIdxHDCL1(uint32_t                    Usage,
+                                                uint32_t                    AssignedMocsIdx,
+                                                GMM_CACHE_POLICY_ELEMENT ClientRequest)
+{
+#define GMM_GEN12_MAX_NUMBER_MOCS_INDEXES (60) // On TGL last four (#60-#63) are reserved by h/w, few? are sw configurable though (#60)
+
+    // Check of assigned Index setting is appropriate for HDCL1 setting
+    if(ClientRequest.HDCL1)
+    {
+        EXPECT_GE(AssignedMocsIdx, GMM_GEN10_HDCL1_MOCS_INDEX_START) << "Usage# " << Usage << ": Index must be greater than " << GMM_GEN10_HDCL1_MOCS_INDEX_START - 1 << " for HDCL1 setting. AssignedMocs: " << AssignedMocsIdx;
+        EXPECT_LT(AssignedMocsIdx, GMM_GEN12_MAX_NUMBER_MOCS_INDEXES) << "Usage# " << Usage << ": Index must be less than " << GMM_GEN12_MAX_NUMBER_MOCS_INDEXES << "for  HDCL1 setting";
+    }
+    else if(AssignedMocsIdx < GMM_GEN12_MAX_NUMBER_MOCS_INDEXES)
+    {
+        EXPECT_LT(AssignedMocsIdx, GMM_GEN10_HDCL1_MOCS_INDEX_START) << "Usage# " << Usage << ": Incorrect Index for HDCL1 setting";
+    }
+}
+
+void CTestGen12dGPUCachePolicy::CheckL3Gen12dGPUCachePolicy()
+{
+    const uint32_t L3_WB_CACHEABLE = 0x3;
+    const uint32_t L3_UNCACHEABLE  = 0x1;
+
+    // Check Usage MOCS index against MOCS settings
+    for(uint32_t Usage = GMM_RESOURCE_USAGE_UNKNOWN; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
+    {
+        GMM_CACHE_POLICY_ELEMENT     ClientRequest   = pGmmULTClientContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
+        uint32_t                        AssignedMocsIdx = ClientRequest.MemoryObjectOverride.Gen12.Index;
+        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmULTClientContext->GetCachePolicyTlbElement(AssignedMocsIdx);
+        uint32_t                     StartMocsIdx    = 1;
+
+        //printf("Usage: %d --> Index: [%d]\n", Usage, AssignedMocsIdx);
+
+        if(StartMocsIdx == 1)
+        {
+            EXPECT_NE(0, AssignedMocsIdx) << "Usage# " << Usage << ": Misprogramming MOCS - Index 0 is reserved for Error";
+        }
+
+        EXPECT_EQ(0, Mocs.L3.ESC) << "Usage# " << Usage << ": ESC is non-zero";
+        EXPECT_EQ(0, Mocs.L3.SCC) << "Usage# " << Usage << ": SCC is non-zero";
+        EXPECT_EQ(0, Mocs.L3.Reserved) << "Usage# " << Usage << ": Reserved field is non-zero";
+        // Check if Mocs Index is not greater than GMM_MAX_NUMBER_MOCS_INDEXES
+        EXPECT_GT(GMM_MAX_NUMBER_MOCS_INDEXES, AssignedMocsIdx) << "Usage# " << Usage << ": MOCS Index greater than MAX allowed (63)";
+
+        if(GfxPlatform.eProductFamily <= IGFX_DG1)
+        {
+            CheckMocsIdxHDCL1(Usage, AssignedMocsIdx, ClientRequest);
+        }
+
+        if(GfxPlatform.eProductFamily <= IGFX_DG1)
+        {
+            CheckSpecialMocs(Usage, AssignedMocsIdx, ClientRequest);
+        }
+
+        if(ClientRequest.L3)
+        {
+            EXPECT_EQ(L3_WB_CACHEABLE, Mocs.L3.Cacheability) << "Usage# " << Usage << ": Incorrect L3 cachebility setting";
+        }
+        else
+        {
+            EXPECT_EQ(L3_UNCACHEABLE, Mocs.L3.Cacheability) << "Usage# " << Usage << ": Incorrect L3 cachebility setting";
+        }
+    }
+}
diff --git a/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.h b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.h
new file mode 100644
index 0000000..8d0776e
--- /dev/null
+++ b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.h
@@ -0,0 +1,45 @@
+/*==============================================================================
+Copyright(c) 2020 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and / or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+============================================================================*/
+
+#pragma once
+
+#include "GmmCachePolicyULT.h"
+
+class CTestGen12dGPUCachePolicy : public CTestCachePolicy
+{
+protected:
+    virtual void SetUpGen12dGPUVariant(PRODUCT_FAMILY);
+    virtual void TearDownGen12dGPUVariant();
+    virtual void CheckL3Gen12dGPUCachePolicy();
+    virtual void CheckSpecialMocs(uint32_t                    Usage,
+                                  uint32_t                    AssignedMocsIdx,
+                                  GMM_CACHE_POLICY_ELEMENT ClientRequest);
+
+    virtual void CheckMocsIdxHDCL1(uint32_t                    Usage,
+                                   uint32_t                    AssignedMocsIdx,
+                                   GMM_CACHE_POLICY_ELEMENT ClientRequest);
+
+public:
+    static void SetUpTestCase();
+    static void TearDownTestCase();
+};
+#pragma once
diff --git a/Source/GmmLib/ULT/GmmGen12dGPUResourceULT.cpp b/Source/GmmLib/ULT/GmmGen12dGPUResourceULT.cpp
new file mode 100644
index 0000000..f7ae8b1
--- /dev/null
+++ b/Source/GmmLib/ULT/GmmGen12dGPUResourceULT.cpp
@@ -0,0 +1,2762 @@
+/*==============================================================================
+Copyright(c) 2020 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and / or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+============================================================================*/
+
+#include "GmmGen12dGPUResourceULT.h"
+
+using namespace std;
+
+/////////////////////////////////////////////////////////////////////////////////////
+/// Sets up common environment for Resource fixture tests. this is called once per
+/// test case before executing all tests under resource fixture test case.
+//  It also calls SetupTestCase from CommonULT to initialize global context and others.
+///
+/// @see    CTestGen12dGPUResource::SetUpTestCase()
+///
+/////////////////////////////////////////////////////////////////////////////////////
+void CTestGen12dGPUResource::SetUpTestCase()
+{
+    printf("%s\n", __FUNCTION__);
+    GfxPlatform.eProductFamily    = IGFX_DG1;
+    GfxPlatform.eRenderCoreFamily = IGFX_GEN12_CORE;
+
+    pGfxAdapterInfo = (ADAPTER_INFO *)malloc(sizeof(ADAPTER_INFO));
+    if(pGfxAdapterInfo)
+    {
+        memset(pGfxAdapterInfo, 0, sizeof(ADAPTER_INFO));
+
+        pGfxAdapterInfo->SkuTable.FtrLinearCCS             = 1; //legacy y =>0 - test both
+        pGfxAdapterInfo->SkuTable.FtrStandardMipTailFormat = 1;
+        pGfxAdapterInfo->SkuTable.FtrTileY                 = 1;
+        CommonULT::SetUpTestCase();
+    }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
+/// cleans up once all the tests finish execution.  It also calls TearDownTestCase
+/// from CommonULT to destroy global context and others.
+///
+/// @see    CTestGen12dGPUResource::TearDownTestCase()
+/////////////////////////////////////////////////////////////////////////////////////
+void CTestGen12dGPUResource::TearDownTestCase()
+{
+    printf("%s\n", __FUNCTION__);
+
+    CommonULT::TearDownTestCase();
+}
+
+TEST_F(CTestGen12dGPUResource, DISABLED_Test1DLinearResource)
+{
+    // Horizontal pixel alignment
+    const uint32_t HAlign[] = {128, 64, 32, 16, 8}; //128Bytes/(bpp>>3)
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_1D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Info.Linear    = 1;
+    gmmParams.Flags.Gpu.Texture    = 1;
+
+    // Allocate 1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        TEST_BPP bpp          = static_cast<TEST_BPP>(i);
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = 0x1;
+        gmmParams.BaseHeight  = 1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        uint32_t AlignedWidth = GMM_ULT_ALIGN(gmmParams.BaseWidth64, HAlign[i]);
+        uint32_t PitchInBytes = AlignedWidth * GetBppValue(bpp);
+        uint32_t AlignedSize  = GMM_ULT_ALIGN(PitchInBytes, PAGE_SIZE);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<false>(ResourceInfo, 0);       // N/A for 1D
+        VerifyResourcePitch<false>(ResourceInfo, 0);        // N/A for 1D
+        VerifyResourcePitchInTiles<false>(ResourceInfo, 0); // N/A for linear
+        VerifyResourceSize<true>(ResourceInfo, AlignedSize);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-arrayed
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+
+    // Allocate more than 1 page
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        TEST_BPP bpp          = static_cast<TEST_BPP>(i);
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = 0x1001;
+        gmmParams.BaseHeight  = 1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        uint32_t AlignedWidth = GMM_ULT_ALIGN(gmmParams.BaseWidth64, HAlign[i]);
+        uint32_t PitchInBytes = AlignedWidth * GetBppValue(bpp);
+        uint32_t AlignedSize  = GMM_ULT_ALIGN(PitchInBytes, PAGE_SIZE);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<false>(ResourceInfo, 0);       // N/A for 1D
+        VerifyResourcePitch<false>(ResourceInfo, 0);        // N/A for 1D
+        VerifyResourcePitchInTiles<false>(ResourceInfo, 0); // N/A for linear
+        VerifyResourceSize<true>(ResourceInfo, AlignedSize);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-arrayed
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 1D Linear Resource Arrays
+TEST_F(CTestGen12dGPUResource, DISABLED_Test1DLinearResourceArrays)
+{
+    // Horizontal pixel alignment
+    const uint32_t HAlign[] = {128, 64, 32, 16, 8}; //128Bytes/(bpp>>3)
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_1D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Info.Linear    = 1;
+    gmmParams.Flags.Gpu.Texture    = 1;
+    gmmParams.ArraySize            = 4;
+
+    // Allocate more than 1 page
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        TEST_BPP bpp          = static_cast<TEST_BPP>(i);
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = 0x1001;
+        gmmParams.BaseHeight  = 1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        uint32_t AlignedWidth = GMM_ULT_ALIGN(gmmParams.BaseWidth64, HAlign[i]);
+        uint32_t PitchInBytes = AlignedWidth * GetBppValue(bpp);
+        uint32_t AlignedSize  = GMM_ULT_ALIGN(PitchInBytes * gmmParams.ArraySize, PAGE_SIZE);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<false>(ResourceInfo, 0);       // N/A for 1D
+        VerifyResourcePitch<false>(ResourceInfo, 0);        // N/A for 1D
+        VerifyResourcePitchInTiles<false>(ResourceInfo, 0); // N/A for linear
+        VerifyResourceSize<true>(ResourceInfo, AlignedSize);
+        VerifyResourceQPitch<true>(ResourceInfo, AlignedWidth);
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 1D Mipped Linear Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test1DLinearResourceMips)
+{
+    // Horizontal pixel alignment
+    const uint32_t HAlign[] = {128, 64, 32, 16, 8}; //128Bytes/(bpp>>3)
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_1D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Info.Linear    = 1;
+    gmmParams.Flags.Gpu.Texture    = 1;
+    gmmParams.MaxLod               = 5;
+
+    // Allocate 256x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        TEST_BPP bpp          = static_cast<TEST_BPP>(i);
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = 0x100;
+        gmmParams.BaseHeight  = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        uint32_t AlignedWidth = GMM_ULT_ALIGN(gmmParams.BaseWidth64, HAlign[i]);
+        for(int mip = 1; mip <= gmmParams.MaxLod; mip++)
+        {
+            // Since 1D doesn't have a height, mips are just based on width
+            AlignedWidth += GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> mip, HAlign[i]);
+        }
+        uint32_t PitchInBytes = AlignedWidth * GetBppValue(bpp);
+        uint32_t AlignedSize  = GMM_ULT_ALIGN(PitchInBytes, PAGE_SIZE);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<false>(ResourceInfo, 0);       // N/A for 1D
+        VerifyResourcePitch<false>(ResourceInfo, 0);        // N/A for 1D
+        VerifyResourcePitchInTiles<false>(ResourceInfo, 0); // N/A for linear
+        VerifyResourceSize<true>(ResourceInfo, AlignedSize);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-arrayed
+
+        // Mip0 should be at offset 0. X/Y/Z Offset should be 0 for linear.
+        GMM_REQ_OFFSET_INFO OffsetInfo = {};
+        OffsetInfo.ReqRender           = 1;
+        OffsetInfo.MipLevel            = 0; //Mip 0
+        ResourceInfo->GetOffset(OffsetInfo);
+        EXPECT_EQ(0, OffsetInfo.Render.Offset64);
+        EXPECT_EQ(0, OffsetInfo.Render.XOffset);
+        EXPECT_EQ(0, OffsetInfo.Render.YOffset);
+        EXPECT_EQ(0, OffsetInfo.Render.ZOffset);
+
+        // All mips should be right after one another linearly
+        uint32_t StartOfMip = 0;
+        for(int mip = 1; mip <= gmmParams.MaxLod; mip++)
+        {
+            OffsetInfo           = {};
+            OffsetInfo.ReqRender = 1;
+            OffsetInfo.MipLevel  = mip;
+            ResourceInfo->GetOffset(OffsetInfo);
+            StartOfMip += GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> (mip - 1), HAlign[i]) * GetBppValue(bpp);
+            EXPECT_EQ(StartOfMip, OffsetInfo.Render.Offset64);
+            EXPECT_EQ(0, OffsetInfo.Render.XOffset);
+            EXPECT_EQ(0, OffsetInfo.Render.YOffset);
+            EXPECT_EQ(0, OffsetInfo.Render.ZOffset);
+        }
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 1D Mipped TileYS Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test1DTileTiledResourceMips)
+{
+    const uint32_t TileSize[TEST_BPP_MAX] = {65536, 32768, 16384, 8192, 4096};
+    const uint32_t Mts[TEST_BPP_MAX]      = {16384, 8192, 4096, 2048, 1024};
+
+    GMM_RESCREATE_PARAMS gmmParams    = {};
+    gmmParams.Type                    = RESOURCE_1D;
+    gmmParams.NoGfxMemory             = 1;
+    gmmParams.Flags.Gpu.TiledResource = 1;
+    gmmParams.Flags.Gpu.Texture       = 1;
+    gmmParams.MaxLod                  = 5;
+
+    // Allocate all mips in 1 tile or multiple tiles, depending on the bpp
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        TEST_BPP bpp          = static_cast<TEST_BPP>(i);
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = 16 * 1024; // 16K is the max width you can specify
+        gmmParams.BaseHeight  = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        uint32_t MaxMip;
+        uint32_t MipTailStart = gmmParams.MaxLod;
+        for(MaxMip = 0; MaxMip <= gmmParams.MaxLod; MaxMip++)
+        {
+            if((gmmParams.BaseWidth64 >> MaxMip) <= Mts[i])
+            {
+                MipTailStart = MaxMip;
+                break;
+            }
+        }
+
+        uint32_t AlignedWidth = 0;
+        for(int mip = 0; mip <= MaxMip; mip++)
+        {
+            // Since 1D doesn't have a height, mips are just based on width
+            AlignedWidth += GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> mip, TileSize[i]);
+            ;
+        }
+
+        uint32_t PitchInBytes = AlignedWidth * GetBppValue(bpp);
+        uint32_t AlignedSize  = GMM_ULT_ALIGN(PitchInBytes, PAGE_SIZE);
+
+        VerifyResourceHAlign<true>(ResourceInfo, TileSize[i]);
+        VerifyResourceVAlign<false>(ResourceInfo, 0);       // N/A for 1D
+        VerifyResourcePitch<false>(ResourceInfo, 0);        // N/A for 1D
+        VerifyResourcePitchInTiles<false>(ResourceInfo, 0); // N/A for linear
+        VerifyResourceSize<true>(ResourceInfo, AlignedSize);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-arrayed
+
+        // All mips should be right after one another linearly, until the miptail
+        uint32_t StartOfMip = 0;
+        int      mip;
+        for(mip = 0; mip < MaxMip; mip++)
+        {
+            GMM_REQ_OFFSET_INFO OffsetInfo = {};
+            OffsetInfo.ReqRender           = 1;
+            OffsetInfo.MipLevel            = mip;
+            ResourceInfo->GetOffset(OffsetInfo);
+            StartOfMip += (mip == 0 ? 0 : GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> (mip - 1), TileSize[i]) * GetBppValue(bpp));
+            EXPECT_EQ(StartOfMip, OffsetInfo.Render.Offset64);
+            EXPECT_EQ(0, OffsetInfo.Render.XOffset);
+            EXPECT_EQ(0, OffsetInfo.Render.YOffset);
+            EXPECT_EQ(0, OffsetInfo.Render.ZOffset);
+        }
+
+        uint32_t MipTailOffsets[GMM_ULT_MAX_MIPMAP] = {32768, 16384, 8192, 4096, 2048, 1536, 1280, 1024, 768, 512, 256, 0, 64, 128, 196};
+        // Check for offset inside miptails.
+        EXPECT_EQ(MipTailStart, ResourceInfo->GetPackedMipTailStartLod());
+        StartOfMip += GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> (mip - 1), TileSize[i]) * GetBppValue(bpp); // Start of MipTail
+        for(int slot = 0; mip <= gmmParams.MaxLod; mip++, slot++)
+        {
+            GMM_REQ_OFFSET_INFO OffsetInfo = {};
+            OffsetInfo.ReqRender           = 1;
+            OffsetInfo.MipLevel            = mip;
+            ResourceInfo->GetOffset(OffsetInfo);
+            EXPECT_EQ(StartOfMip, OffsetInfo.Render.Offset64);          // Start of Miptail
+            EXPECT_EQ(MipTailOffsets[slot], OffsetInfo.Render.XOffset); // Offset within miptail
+            EXPECT_EQ(0, OffsetInfo.Render.YOffset);
+            EXPECT_EQ(0, OffsetInfo.Render.ZOffset);
+        }
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 2D TileYf Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test2DTileYfCompressedResource)
+{
+    const uint32_t HAlign[TEST_BPP_MAX] = {64, 64, 32, 32, 16};
+    const uint32_t VAlign[TEST_BPP_MAX] = {64, 32, 32, 16, 16};
+
+    const uint32_t TileSize[TEST_BPP_MAX][2] = {{64, 64},
+                                                {128, 32},
+                                                {128, 32},
+                                                {256, 16},
+                                                {256, 16}};
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_2D;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Info.TiledY           = 1;
+    gmmParams.Flags.Info.TiledYf          = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1;
+    // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf its also used to pad surf
+    // to 4x1 tile (reqd by HW )
+    // If unifiedAuxSurf reqd (mandatory for displayable or cross-adapter shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+
+    //Allocate 1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_2D, bpp);
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = 0x1;
+        gmmParams.BaseHeight   = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, 4 * TileSize[i][0]); // As wide as 4 Tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);           // 4 Tile wide
+        VerifyResourceSize<true>(ResourceInfo, 4 * GMM_KBYTE(4));    // 4 Tile Big
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 16KB
+        //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_2D, bpp);
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = 0x1;
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0] * 4); // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);           // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4);    // 2 tile big, but 4-tile pitch alignment
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 16KB
+        //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X/Y dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_2D, bpp);
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = TileSize[i][1] + 1;                      // 1 row larger than 1 tile height
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0] * 4);  // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);            // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4 * 2); // 4 tile wide; and 2-tile high
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // Not tested
+                                                      //test main surface base alignment is 16KB
+                                                      //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 2D TileY Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test2DTileYCompressedResource)
+{
+    const uint32_t HAlign = {16};
+    const uint32_t VAlign = {4};
+
+    const uint32_t TileSize[2] = {128, 32};
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_2D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Info.TiledY    = 1;
+
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1;
+    // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf/Y its also used to pad surf
+    // to 4x1 tile (reqd by HW for perf reasons)
+    // If unifiedAuxSurf reqd (mandatory for displayable or cross-adapter shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+
+    //Allocate 1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = 0x1;
+        gmmParams.BaseHeight   = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, 4 * TileSize[0]); // As wide as 4 Tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);        // 4 Tile wide
+        VerifyResourceSize<true>(ResourceInfo, 4 * GMM_KBYTE(4)); // 4 Tile Big
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 16KB
+        //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = 0x1;
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[0] * 4); // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);        // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4); // 2 tile big, but 4-tile pitch alignment
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X/Y dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = TileSize[1] + 1;                      // 1 row larger than 1 tile height
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[0] * 4);     // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);            // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4 * 2); // 4 tile wide; and 2-tile high
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+                                                      //test main surface base alignment is 16KB
+                                                      //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 2D TileY lossless Compressed lossy Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test2DTileYLossyCompressedResource)
+{
+    const uint32_t HAlign = {4};
+    const uint32_t VAlign = {4};
+
+    const uint32_t TileSize[2] = {128, 32};
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_2D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Info.TiledY    = 1;
+
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1;
+    // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf its also used to pad surf
+    // to 4x1 tile (reqd by HW for perf reasons)
+    // If unifiedAuxSurf reqd (mandatory for displayable or cross-adapter shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+
+    //Allocate 1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = GMM_FORMAT_ETC2_RGB8;
+        gmmParams.BaseWidth64  = 0x80;
+        gmmParams.BaseHeight   = 0x20;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, 4 * TileSize[0]); // As wide as 4 Tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);        // 4 Tile wide
+        VerifyResourceSize<true>(ResourceInfo, 4 * GMM_KBYTE(4)); // 4 Tile Big
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 16KB
+        //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = GMM_FORMAT_ETC2_RGB8;
+        gmmParams.BaseWidth64  = (TileSize[0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = 0x1;
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[0] * 4); // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);        // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4); // 2 tile big, but 4-tile pitch alignment
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 16KB
+        //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X/Y dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = GMM_FORMAT_ETC2_RGB8;
+        gmmParams.BaseWidth64  = (TileSize[0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = TileSize[1] + 1;                      // 1 row larger than 1 tile height
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[0] * 4); // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);        // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4); // 4 tile wide; max compressed height = 0x24/4 = 9, so fits in 1 tile-height
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+                                                      //test main surface base alignment is 16KB
+                                                      //For Yf/Y test main surface pitch is 4-tileYF/Y aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+//Y416(64bpp -how is 10/12/16bit depth given?)
+//Y410(32bpp), Y216(64bpp), YCRCB_NORMAL(16bpp), YCRCB_SWAPUV(16bpp),
+//YCRCB_SWAPUVY(16bpp), YCRCB_SWAPY(16bpp)
+
+/// @brief ULT for Planar Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_TestPlanarYfCompressedResource)
+{
+    const uint32_t TileSize[TEST_BPP_MAX][2] = {
+    {64, 64}, {128, 32}, {128, 32}, {256, 16}, {256, 16}}; // TileYf
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_2D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Gpu.Texture    = 1;
+    //gmmParams.Flags.Gpu.MMC = 1;
+    gmmParams.Flags.Gpu.CCS              = 1;
+    gmmParams.Flags.Info.MediaCompressed = 1;
+    gmmParams.BaseWidth64                = 0x100;
+    gmmParams.BaseHeight                 = 0x50;
+    gmmParams.Depth                      = 0x1;
+    SetTileFlag(gmmParams, TEST_TILEYF); // TileYF only
+
+    //UV-Packed formats
+    GMM_RESOURCE_FORMAT Format[4] = {GMM_FORMAT_NV12, GMM_FORMAT_NV21, GMM_FORMAT_P010, GMM_FORMAT_P016};
+    for(auto fmt : Format)
+    {
+        gmmParams.Format = fmt; // 8bpp (NV12, NV21), 16bpp (P016,P010)
+
+        TEST_BPP Ybpp, UVbpp;
+        //Yf/Ys could be accessed on CPU/app where UV plane bpp is double
+        switch(pGmmULTClientContext->GetPlatformInfo().FormatTable[fmt].Element.BitsPer)
+        {
+            case 8:
+                Ybpp  = TEST_BPP_8;
+                UVbpp = TEST_BPP_16;
+                break;
+            case 16:
+                Ybpp  = TEST_BPP_16;
+                UVbpp = TEST_BPP_32;
+                break;
+            default:
+                return;
+        }
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1;
+
+        /*Aux is TileY (later Linear), not redescribing, its bytes are allocated using one bpp*/
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_2D, Ybpp);
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        //Redescribed Pitch isn't modified unless Y, UV pitch differ
+        //But, original Pitch is padded to have even Tile, hence use Ybpp ExpectedPitch
+        //to verify Pitch, but redescribed size
+        uint32_t ExpectedPitch    = GMM_ULT_ALIGN(gmmParams.BaseWidth64 * (int)pow(2.0, Ybpp), TileSize[Ybpp][0] * 4);
+        uint32_t RedescribedPitch = GMM_ULT_ALIGN(gmmParams.BaseWidth64 / 2 * (int)pow(2.0, UVbpp), TileSize[UVbpp][0] * 4);
+
+        //ExpectedPitch = GMM_ULT_ALIGN(ExpectedPitch, 2 * TileSize[Ybpp][0]);   //pad to even tile
+        if(ExpectedPitch != RedescribedPitch)
+        {
+            ExpectedPitch = RedescribedPitch;
+        }
+
+        VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+        VerifyResourcePitchInTiles<true>(ResourceInfo, ExpectedPitch / TileSize[Ybpp][0]);
+
+        int YSizeInTiles = (GMM_ULT_ALIGN(gmmParams.BaseHeight, TileSize[Ybpp][1]) / TileSize[Ybpp][1]) *
+                           RedescribedPitch / TileSize[Ybpp][0];
+        int UVSizeInTiles = (GMM_ULT_ALIGN(gmmParams.BaseHeight / 2, TileSize[UVbpp][1]) / TileSize[UVbpp][1]) *
+                            RedescribedPitch / TileSize[UVbpp][0];
+
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * (YSizeInTiles + UVSizeInTiles));
+        VerifyResourceHAlign<true>(ResourceInfo, TileSize[UVbpp][0] / pow(2.0, UVbpp)); // For Yf/Ys planar redescription causes UV width, Y height alignment
+        VerifyResourceVAlign<true>(ResourceInfo, TileSize[Ybpp][1]);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-mipped surface
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+
+        EXPECT_EQ(GMM_KBYTE(4) * 2, ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS)); // Y and UV Aux are on separate tiles
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+            EXPECT_EQ(GMM_KBYTE(4) * 2, AuxResourceInfo->GetSizeSurface());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for Planar Y Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_TestPlanarYCompressedResource)
+{
+    const uint32_t TileSize[2] = {128, 32};
+    const uint32_t HAlign      = 16;
+    const uint32_t VAlign      = 4;
+
+    GMM_RESCREATE_PARAMS gmmParams         = {};
+    gmmParams.Type                         = RESOURCE_2D;
+    gmmParams.NoGfxMemory                  = 1;
+    gmmParams.Flags.Gpu.Texture            = 1;
+    gmmParams.Flags.Gpu.RenderTarget       = 1;
+    gmmParams.Flags.Gpu.MMC                = 1;
+    gmmParams.Flags.Gpu.CCS                = 1;
+    gmmParams.Flags.Gpu.IndirectClearColor = 1;
+    gmmParams.Flags.Info.MediaCompressed   = 1;
+    gmmParams.Flags.Info.NotLockable       = 1;
+    gmmParams.Flags.Info.Cacheable         = 1;
+    gmmParams.BaseWidth64                  = 0xB2;
+    gmmParams.BaseHeight                   = 0x92;
+    gmmParams.Depth                        = 0x1;
+    SetTileFlag(gmmParams, TEST_TILEY); // TileYF only
+
+    GMM_RESOURCE_FORMAT Format[4] = {GMM_FORMAT_NV12, GMM_FORMAT_NV21, GMM_FORMAT_P010, GMM_FORMAT_P016};
+    for(auto fmt : Format)
+    {
+        gmmParams.Format = fmt; // 8bpp (NV12, NV21), 16bpp (P016, P010)
+
+        TEST_BPP Ybpp, UVbpp;
+        //Yf/Ys could be accessed on CPU/app where UV plane bpp is double
+        switch(pGmmULTClientContext->GetPlatformInfo().FormatTable[fmt].Element.BitsPer)
+        {
+            case 8:
+                Ybpp  = TEST_BPP_8;
+                UVbpp = TEST_BPP_16;
+                break;
+            case 16:
+                Ybpp  = TEST_BPP_16;
+                UVbpp = TEST_BPP_32;
+                break;
+            default:
+                return;
+        }
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1;
+
+        GMM_TILE_MODE      TileMode = LEGACY_TILE_Y;
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        //Redescribed Pitch isn't modified unless Y, UV pitch differ
+        //But, original Pitch is padded to have even Tile, hence use Ybpp ExpectedPitch
+        //to verify Pitch, but redescribed size
+        uint32_t ExpectedPitch    = GMM_ULT_ALIGN(gmmParams.BaseWidth64 * (int)pow(2.0, Ybpp), TileSize[0] * 4);
+        uint32_t RedescribedPitch = GMM_ULT_ALIGN(gmmParams.BaseWidth64 / 2 * (int)pow(2.0, UVbpp), TileSize[0] * 4);
+
+        //ExpectedPitch = GMM_ULT_ALIGN(ExpectedPitch, 2 * TileSize[Ybpp][0]);   //pad to even tile
+        if(ExpectedPitch != RedescribedPitch)
+        {
+            ExpectedPitch = RedescribedPitch;
+        }
+
+        VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+        VerifyResourcePitchInTiles<true>(ResourceInfo, ExpectedPitch / TileSize[0]);
+
+        int YSizeInTiles = (GMM_ULT_ALIGN(gmmParams.BaseHeight, TileSize[1]) / TileSize[1]) *
+                           RedescribedPitch / TileSize[0];
+        int UVSizeInTiles = (GMM_ULT_ALIGN(gmmParams.BaseHeight / 2, TileSize[1]) / TileSize[1]) *
+                            RedescribedPitch / TileSize[0];
+
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * (YSizeInTiles + UVSizeInTiles)); //when main-surf planes are tile-aligned, make it verify-true
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-mipped surface
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileY aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_UV_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4) * 2, ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS)); // Y and UV Aux are on separate tiles
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for Planar Ys Compressed resource
+TEST_F(CTestGen12dGPUResource, DISABLED_TestPlanarYsCompressedResource)
+{
+    const TEST_TILE_TYPE TileTypeSupported = {TEST_TILEYS};
+
+    const uint32_t TileSize[TEST_BPP_MAX][2] = {
+    {256, 256}, {512, 128}, {512, 128}, {1024, 64}, {1024, 64}}; // TileYS
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_2D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Gpu.Texture    = 1;
+    gmmParams.Flags.Gpu.MMC        = 1;
+    //gmmParams.Flags.Gpu.CCS = 1;
+    gmmParams.Flags.Gpu.UnifiedAuxSurface = 1;
+    gmmParams.Flags.Info.MediaCompressed  = 1;
+    gmmParams.BaseWidth64                 = 0x100;
+    gmmParams.BaseHeight                  = 0x50;
+    gmmParams.Depth                       = 0x1;
+    SetTileFlag(gmmParams, TEST_TILEYS); // TileYS only
+
+    GMM_RESOURCE_FORMAT Format[4] = {GMM_FORMAT_NV12, GMM_FORMAT_NV21, GMM_FORMAT_P010, GMM_FORMAT_P016};
+    for(auto fmt : Format)
+    {
+        gmmParams.Format = fmt; // 8bpp(NV12) , P016 (16bpp), P010 (16bpp), NV21(8bpp)
+
+        TEST_BPP Ybpp, UVbpp;
+        //Yf/Ys could be accessed on CPU/app where UV plane bpp is double
+        switch(pGmmULTClientContext->GetPlatformInfo().FormatTable[gmmParams.Format].Element.BitsPer)
+        {
+            case 8:
+                Ybpp  = TEST_BPP_8;
+                UVbpp = TEST_BPP_16;
+                break;
+            case 16:
+                Ybpp  = TEST_BPP_16;
+                UVbpp = TEST_BPP_32;
+                break;
+            default:
+                return;
+        }
+
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1;
+        GMM_TILE_MODE TileMode                = DEFINE_TILE(YS_2D, Ybpp);
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        //Redescribed Pitch isn't modified unless Y, UV pitch differ
+        //But, original Pitch is padded to have even Tile, hence use Ybpp ExpectedPitch
+        //to verify Pitch, but redescribed pitch to verify size
+        uint32_t ExpectedPitch    = GMM_ULT_ALIGN(gmmParams.BaseWidth64 * (int)pow(2.0, Ybpp), TileSize[Ybpp][0]);
+        uint32_t RedescribedPitch = GMM_ULT_ALIGN(gmmParams.BaseWidth64 / 2 * (int)pow(2.0, UVbpp), TileSize[UVbpp][0]);
+
+        if(ExpectedPitch != RedescribedPitch)
+        {
+            ExpectedPitch = RedescribedPitch;
+        }
+        else
+        {
+            //ExpectedPitch = GMM_ULT_ALIGN(ExpectedPitch, 2 * TileSize[Ybpp][0]); //pad to even tile
+            //ExpectedPitch = GMM_ULT_ALIGN(ExpectedPitch, (2 * TileSize[UVbpp][0]/ (int)pow(2.0, UVbpp))); //pad to even tile
+        }
+
+        VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+        VerifyResourcePitchInTiles<true>(ResourceInfo, ExpectedPitch / TileSize[Ybpp][0]);
+
+        int YSizeInTiles = (GMM_ULT_ALIGN(gmmParams.BaseHeight, TileSize[Ybpp][1]) / TileSize[Ybpp][1]) *
+                           RedescribedPitch / TileSize[Ybpp][0];
+        int UVSizeInTiles = (GMM_ULT_ALIGN(gmmParams.BaseHeight / 2, TileSize[UVbpp][1]) / TileSize[UVbpp][1]) *
+                            RedescribedPitch / TileSize[UVbpp][0];
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(64) * (YSizeInTiles + UVSizeInTiles));
+        VerifyResourceHAlign<true>(ResourceInfo, TileSize[UVbpp][0] / pow(2.0, UVbpp)); // For Yf/Ys planar redescription causes UV width, Y height alignment
+        VerifyResourceVAlign<true>(ResourceInfo, TileSize[Ybpp][1]);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-mipped surface
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        //EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);   // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_UV_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+
+        EXPECT_EQ(GMM_KBYTE(4) * 2, ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS)); // Y and UV Aux are on separate tiles
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 2D arrayed compressed Resource
+TEST_F(CTestGen12dGPUResource, TestArrayedCompressedResource)
+{
+    //printf("%s\n", __FUNCTION__);
+    //Test for 3D array
+}
+
+/// @brief ULT for mip-mapped compressed Resource
+TEST_F(CTestGen12dGPUResource, TestMipMapCompressedResource)
+{
+    //printf("%s\n", __FUNCTION__);
+}
+
+/// @brief ULT for cube Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_TestCubeCompressedResource)
+{
+    //Tests 2D array
+    const uint32_t HAlign[5][TEST_BPP_MAX] = {{0}, {0}, {0}, {256, 256, 128, 128, 64}, {64, 64, 32, 32, 16}};
+    const uint32_t VAlign[5][TEST_BPP_MAX] = {{0}, {0}, {0}, {256, 128, 128, 64, 64}, {64, 32, 32, 16, 16}};
+
+    const TEST_TILE_TYPE TileTypeSupported[2] = {TEST_TILEYS, TEST_TILEYF};
+
+    const uint32_t TileSize[5][TEST_BPP_MAX][2] = {
+    {0},
+    {0},
+    {0},
+    {{256, 256}, {512, 128}, {512, 128}, {1024, 64}, {1024, 64}}, // TileYS
+    {{64, 64}, {128, 32}, {128, 32}, {256, 16}, {256, 16}}};      //TileYf
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_CUBE;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1;
+
+    // Allocate 1x1 surface so that it occupies 1 Tile in X dimension
+    for(auto Tiling : TileTypeSupported)
+    {
+        gmmParams.Flags.Info.TiledY  = 1;
+        gmmParams.Flags.Info.TiledYf = (Tiling == TEST_TILEYF);
+        gmmParams.Flags.Info.TiledYs = (Tiling == TEST_TILEYS);
+        for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+        {
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 1;
+            gmmParams.Flags.Gpu.CCS               = 1;
+
+            TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+            GMM_TILE_MODE TileMode = (Tiling == TEST_TILEYF) ? DEFINE_TILE(YF_2D, bpp) : DEFINE_TILE(YS_2D, bpp);
+
+            gmmParams.Format      = SetResourceFormat(bpp);
+            gmmParams.BaseWidth64 = 0x1;
+            gmmParams.BaseHeight  = 0x1;
+            gmmParams.Depth       = 0x1;
+
+            GMM_RESOURCE_INFO *ResourceInfo;
+            ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+            VerifyResourceHAlign<true>(ResourceInfo, HAlign[Tiling][i]);
+            VerifyResourceVAlign<true>(ResourceInfo, VAlign[Tiling][i]);
+
+            uint32_t ExpectedPitch = 4 * TileSize[TEST_TILEYF][i][0];
+            VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);                          // As wide as 4 tile-YF
+            VerifyResourcePitchInTiles<true>(ResourceInfo, (Tiling == TEST_TILEYF) ? 4 : 1); // 1 tile wide
+
+            uint32_t ExpectedQPitch = VAlign[Tiling][i];
+            VerifyResourceQPitch<true>(ResourceInfo, ExpectedQPitch); // Each face should be VAlign rows apart within a tile
+
+            VerifyResourceSize<true>(ResourceInfo, // PitchInBytes * Rows where Rows = __GMM_MAX_CUBE_FACE x QPitch, then aligned to tile boundary
+                                     ExpectedPitch *
+                                     __GMM_MAX_CUBE_FACE * ExpectedQPitch);
+
+            //test main surface base alignment is 16KB
+            //For Yf test main surface pitch is 4-tileYF aligned
+            EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+            EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % ((Tiling == TEST_TILEYF) ? 4 : 1));
+
+            if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+            {
+                EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+                EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+            }
+
+            EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+            { //separate Aux
+                gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+                GMM_RESOURCE_INFO *AuxResourceInfo;
+                AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+                EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+                EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+                EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+                EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+                pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+            }
+
+            for(uint32_t CubeFaceIndex = 0; CubeFaceIndex < __GMM_MAX_CUBE_FACE; CubeFaceIndex++)
+            {
+                GMM_REQ_OFFSET_INFO OffsetInfo = {};
+                OffsetInfo.ReqRender           = 1;
+                OffsetInfo.CubeFace            = static_cast<GMM_CUBE_FACE_ENUM>(CubeFaceIndex);
+                ResourceInfo->GetOffset(OffsetInfo);
+
+                EXPECT_EQ((CubeFaceIndex * ExpectedQPitch) * ExpectedPitch,
+                          OffsetInfo.Render.Offset64);   // Render offset is tile's base address on which cube face begins.
+                EXPECT_EQ(0, OffsetInfo.Render.XOffset); // X Offset should be 0 as cube face starts on tile boundary
+                EXPECT_EQ(0, OffsetInfo.Render.YOffset); // Y Offset should be 0 as cube face starts on tile boundary
+                EXPECT_EQ(0, OffsetInfo.Render.ZOffset); // Z offset N/A should be 0
+            }
+            pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+        }
+
+        // Allocate 2 tiles in X dimension.
+        // Width and Height must be equal
+        for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+        {
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 1;
+            gmmParams.Flags.Gpu.CCS               = 1;
+            TEST_BPP      bpp                     = static_cast<TEST_BPP>(i);
+            GMM_TILE_MODE TileMode                = (Tiling == TEST_TILEYF) ? DEFINE_TILE(YF_2D, bpp) : DEFINE_TILE(YS_2D, bpp);
+
+            gmmParams.Format      = SetResourceFormat(bpp);
+            gmmParams.BaseWidth64 = (TileSize[Tiling][i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+            gmmParams.BaseHeight  = gmmParams.BaseWidth64;                           // Heigth must be equal to width.
+            gmmParams.Depth       = 0x1;
+
+            GMM_RESOURCE_INFO *ResourceInfo;
+            ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+            VerifyResourceHAlign<true>(ResourceInfo, HAlign[Tiling][i]);
+            VerifyResourceVAlign<true>(ResourceInfo, VAlign[Tiling][i]);
+
+            uint32_t ExpectedPitch = TileSize[Tiling][i][0] * 2 * ((Tiling == TEST_TILEYF) ? 2 : 1); // As wide as 2 tile, padded to 4 tile-pitch
+            VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+            VerifyResourcePitchInTiles<true>(ResourceInfo, 2 * ((Tiling == TEST_TILEYF) ? 2 : 1)); // 2 tile wide
+
+            uint32_t ExpectedQPitch = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign[Tiling][i]);
+            VerifyResourceQPitch<true>(ResourceInfo, ExpectedQPitch); // Each face should be Valigned-BaseHeight rows apart
+
+            VerifyResourceSize<true>(ResourceInfo, // PitchInBytes * Rows where Rows = __GMM_MAX_CUBE_FACE x QPitch, then aligned to tile boundary
+                                     ExpectedPitch *
+                                     __GMM_MAX_CUBE_FACE * ExpectedQPitch);
+
+            //test main surface base alignment is 16KB
+            //For Yf test main surface pitch is 4-tileYF aligned
+            EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+            EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % ((Tiling == TEST_TILEYF) ? 4 : 1)); // Check on YF only
+
+            if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+            {
+                EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+                EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+            }
+
+            { //separate Aux
+                gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+                GMM_RESOURCE_INFO *AuxResourceInfo;
+                AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+                EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+                EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+                EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+                EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+                pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+            }
+
+            for(uint32_t CubeFaceIndex = 0; CubeFaceIndex < __GMM_MAX_CUBE_FACE; CubeFaceIndex++)
+            {
+                GMM_REQ_OFFSET_INFO OffsetInfo = {};
+                OffsetInfo.ReqRender           = 1;
+                OffsetInfo.CubeFace            = static_cast<GMM_CUBE_FACE_ENUM>(CubeFaceIndex);
+                ResourceInfo->GetOffset(OffsetInfo);
+                EXPECT_EQ((CubeFaceIndex * ExpectedQPitch) * ExpectedPitch,
+                          OffsetInfo.Render.Offset64);   // Render offset is tile's base address on which cube face begins.
+                EXPECT_EQ(0, OffsetInfo.Render.XOffset); // X Offset should be 0 as cube face starts on tile boundary
+                EXPECT_EQ(0, OffsetInfo.Render.YOffset); // Y Offset should be 0 as cube face starts on tile boundary
+                EXPECT_EQ(0, OffsetInfo.Render.ZOffset); // Z offset N/A should be 0
+            }
+            pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+        }
+    }
+}
+
+/// @brief ULT for 3D TileYs Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test3DTileYsCompressedResource)
+{
+    if(!const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+    {
+        return;
+    }
+    // Horizontal/Vertical pixel alignment
+    const uint32_t HAlign[TEST_BPP_MAX] = {64, 32, 32, 32, 16};
+    const uint32_t VAlign[TEST_BPP_MAX] = {32, 32, 32, 16, 16};
+
+    const uint32_t TileSize[TEST_BPP_MAX][3] = {{64, 32, 32},
+                                                {64, 32, 32},
+                                                {128, 32, 16},
+                                                {256, 16, 16},
+                                                {256, 16, 16}};
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_3D;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Info.TiledY           = 1;
+    gmmParams.Flags.Info.TiledYs          = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1; // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf its also used to pad surf
+                                               // to 4x1 tile (reqd by HW for perf reasons)
+
+    // Allocate 1x1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YS_3D, bpp);
+
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = 0x1;
+        gmmParams.BaseHeight  = 0x1;
+        gmmParams.Depth       = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0]); // As wide as 1 tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 1);       // 1 tile wide
+        VerifyResourceSize<false>(ResourceInfo, GMM_KBYTE(64));  // 1 tile big
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // Not tested
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YS_3D, bpp);
+
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = (TileSize[i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight  = 0x1;
+        gmmParams.Depth       = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0] * 2); // As wide as 2 tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 2);           // 2 tile wide
+        VerifyResourceSize<false>(ResourceInfo, GMM_KBYTE(64) * 2);  // 2 tile big
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // Not tested
+                                                      //test main surface base alignment is 16KB
+                                                      //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X/Y dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YS_3D, bpp);
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = TileSize[i][1] + 1;                      // 1 row larger than 1 tile height
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0] * 2); // As wide as 2 tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 2);           // 2 tile wide
+        VerifyResourceSize<false>(ResourceInfo, GMM_KBYTE(64) * 4);  // 4 tile big
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X/Y/Z dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YS_3D, bpp);
+
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = (TileSize[i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight  = TileSize[i][1] + 1;                      // 1 row larger than 1 tile height
+        gmmParams.Depth       = TileSize[i][2] + 1;                      // 1 plane larger than 1 tile depth
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0] * 2); // As wide as 2 tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 2);           // 2 tile wide
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(64) * 8);   // 8 tile big
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // Not tested
+                                                      //test main surface base alignment is 16KB
+                                                      //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 3D TileYf Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test3DTileYfCompressedResource)
+{
+    if(!const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+    {
+        return;
+    }
+    // Horizontal/Verticle pixel alignment
+    const uint32_t HAlign[TEST_BPP_MAX]      = {16, 8, 8, 8, 4};
+    const uint32_t VAlign[TEST_BPP_MAX]      = {16, 16, 16, 8, 8};
+    const uint32_t TileSize[TEST_BPP_MAX][3] = {{16, 16, 16},
+                                                {16, 16, 16},
+                                                {32, 16, 8},
+                                                {64, 8, 8},
+                                                {64, 8, 8}};
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_3D;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Info.TiledY           = 1;
+    gmmParams.Flags.Info.TiledYf          = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1; // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf its also used to pad surf
+                                               // to 4x1 tile (reqd by HW for perf reasons)
+
+    // Allocate 1x1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+                                                   //gmmParams.Flags.Gpu.MMC = 0;              //Turn on to check unifiedaux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_3D, bpp);
+
+        gmmParams.Format = SetResourceFormat(bpp);
+        //gmmParams.BaseWidth64 = 0x30;
+        //gmmParams.BaseHeight = 0x30;
+        //gmmParams.Depth = 0x20;
+        gmmParams.BaseWidth64         = 1;
+        gmmParams.BaseHeight          = 1;
+        gmmParams.Depth               = 1;
+        const uint32_t PitchAlignment = 32;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(gmmParams.BaseWidth64, TileSize[i][0] * 4));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(gmmParams.BaseWidth64, TileSize[i][0] * 4) / TileSize[i][0]);
+        VerifyResourceSize<true>(ResourceInfo, (GMM_ULT_ALIGN(gmmParams.BaseWidth64, TileSize[i][0] * 4) / TileSize[i][0]) *
+                                               (GMM_ULT_ALIGN(gmmParams.BaseHeight, TileSize[i][1]) / TileSize[i][1]) *
+                                               (GMM_ULT_ALIGN(gmmParams.Depth, TileSize[i][2]) / TileSize[i][2]) * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, (GMM_ULT_ALIGN(gmmParams.BaseHeight, TileSize[i][1])));
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_3D, bpp);
+
+        gmmParams.Format              = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64         = (TileSize[i][0] / GetBppValue(bpp)) + 1;
+        gmmParams.BaseHeight          = 0x1;
+        gmmParams.Depth               = 0x1;
+        const uint32_t PitchAlignment = 32;
+
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment) / TileSize[i][0]);
+        VerifyResourceSize<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment) / TileSize[i][0] * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, TileSize[i][1]);
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X/Y dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_3D, bpp);
+
+        gmmParams.Format              = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64         = (TileSize[i][0] / GetBppValue(bpp)) + 1;
+        gmmParams.BaseHeight          = TileSize[i][1] + 1;
+        gmmParams.Depth               = 0x1;
+        const uint32_t PitchAlignment = 32;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment) / TileSize[i][0]);
+        VerifyResourceSize<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment) / TileSize[i][0] * 2 * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, TileSize[i][1] * 2);
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X/Y/Z dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_3D, bpp);
+
+        gmmParams.Format              = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64         = (TileSize[i][0] / GetBppValue(bpp)) + 1;
+        gmmParams.BaseHeight          = TileSize[i][1] + 1;
+        gmmParams.Depth               = TileSize[i][2] + 1;
+        const uint32_t PitchAlignment = 32;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment) / TileSize[i][0]);
+        VerifyResourceSize<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[i][0] * 4, PitchAlignment) / TileSize[i][0] * 2 * 2 * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, TileSize[i][1] * 2);
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+            EXPECT_GE(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), ResourceInfo->GetSizeMainSurface() >> 8);
+        }
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 3D TileY Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test3DTileYCompressedResource)
+{
+    if(!const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+    {
+        return;
+    }
+    // Horizontal/Verticle pixel alignment
+    const uint32_t HAlign      = {16};
+    const uint32_t VAlign      = {4};
+    const uint32_t TileSize[3] = {128, 32, 1};
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_3D;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Info.TiledY           = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1; // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf its also used to pad surf
+                                               // to 4x1 tile (reqd by HW for perf reasons)
+
+    // Allocate 1x1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+
+        gmmParams.Format = SetResourceFormat(bpp);
+        //gmmParams.BaseWidth64 = 0x30;
+        //gmmParams.BaseHeight = 0x30;
+        //gmmParams.Depth = 0x20;
+        gmmParams.BaseWidth64         = 1;
+        gmmParams.BaseHeight          = 1;
+        gmmParams.Depth               = 1;
+        const uint32_t PitchAlignment = 32;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(gmmParams.BaseWidth64, TileSize[0] * 4));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(gmmParams.BaseWidth64, TileSize[0] * 4) / TileSize[0]);
+        VerifyResourceSize<true>(ResourceInfo, (GMM_ULT_ALIGN(gmmParams.BaseWidth64, TileSize[0] * 4) / TileSize[0]) *
+                                               (GMM_ULT_ALIGN(gmmParams.BaseHeight, TileSize[1]) / TileSize[1]) *
+                                               (GMM_ULT_ALIGN(gmmParams.Depth, TileSize[2]) / TileSize[2]) * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, (GMM_ULT_ALIGN(gmmParams.BaseHeight, TileSize[1])));
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp             = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode        = LEGACY_TILE_Y;
+        gmmParams.Format              = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64         = (TileSize[0] / GetBppValue(bpp)) + 1;
+        gmmParams.BaseHeight          = 0x1;
+        gmmParams.Depth               = 0x1;
+        const uint32_t PitchAlignment = 32;
+
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment) / TileSize[0]);
+        VerifyResourceSize<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment) / TileSize[0] * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, TileSize[1]);
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X/Y dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp             = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode        = LEGACY_TILE_Y;
+        gmmParams.Format              = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64         = (TileSize[0] / GetBppValue(bpp)) + 1;
+        gmmParams.BaseHeight          = TileSize[1] + 1;
+        gmmParams.Depth               = 0x1;
+        const uint32_t PitchAlignment = 32;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment) / TileSize[0]);
+        VerifyResourceSize<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment) / TileSize[0] * 2 * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, TileSize[1] * 2);
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate 2 tiles in X/Y/Z dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp             = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode        = LEGACY_TILE_Y;
+        gmmParams.Format              = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64         = (TileSize[0] / GetBppValue(bpp)) + 1;
+        gmmParams.BaseHeight          = TileSize[1] + 1;
+        gmmParams.Depth               = TileSize[2] + 1;
+        const uint32_t PitchAlignment = 32;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment));
+        VerifyResourcePitchInTiles<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment) / TileSize[0]);
+        VerifyResourceSize<true>(ResourceInfo, GMM_ULT_ALIGN(TileSize[0] * 4, PitchAlignment) / TileSize[0] * 2 * 2 * GMM_KBYTE(4));
+        VerifyResourceQPitch<true>(ResourceInfo, TileSize[1] * 2);
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for 2D Yf mipped compressed resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test2DTileYfMippedCompressedResource)
+{
+    if(!const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+    {
+        return;
+    }
+    const uint32_t HAlign[TEST_BPP_MAX] = {64, 64, 32, 32, 16};
+    const uint32_t VAlign[TEST_BPP_MAX] = {64, 32, 32, 16, 16};
+
+    const uint32_t TileSize[TEST_BPP_MAX][2] = {{64, 64},
+                                                {128, 32},
+                                                {128, 32},
+                                                {256, 16},
+                                                {256, 16}};
+
+    const uint32_t MtsWidth[TEST_BPP_MAX]  = {32, 32, 16, 16, 8};
+    const uint32_t MtsHeight[TEST_BPP_MAX] = {64, 32, 32, 16, 16};
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_2D;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Info.TiledY           = 1;
+    gmmParams.Flags.Info.TiledYf          = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1; // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf its also used to pad surf
+                                               // to 4x1 tile (reqd by HW for perf reasons)
+    gmmParams.MaxLod    = 4;
+    gmmParams.ArraySize = 4;
+
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        uint32_t AlignedWidth    = 0;
+        uint32_t AlignedHeight   = 0;
+        uint32_t ExpectedPitch   = 0;
+        uint32_t MipTailStartLod = 0;
+        // Valigned Mip Heights
+        uint32_t Mip0Height    = 0;
+        uint32_t Mip1Height    = 0;
+        uint32_t Mip2Height    = 0;
+        uint32_t Mip3Height    = 0;
+        uint32_t Mip4Height    = 0;
+        uint32_t Mip5Height    = 0;
+        uint32_t Mip2Higher    = 0; // Sum of aligned heights of Mip2 and above
+        uint32_t MipTailHeight = 0;
+        // Haligned Mip Widths
+        uint32_t Mip0Width = 0;
+        uint32_t Mip1Width = 0;
+        uint32_t Mip2Width = 0;
+
+        TEST_BPP bpp          = static_cast<TEST_BPP>(i);
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = 0x38;
+        gmmParams.BaseHeight  = 0x38;
+
+        // If unifiedAuxSurf reqd (mandatory for displayable or cross-device shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+
+        // find the miptail start level
+        {
+            uint32_t MipWidth  = gmmParams.BaseWidth64;
+            uint32_t MipHeight = gmmParams.BaseHeight;
+            while(!(MipWidth <= MtsWidth[i] && MipHeight <= MtsHeight[i]))
+            {
+                MipTailStartLod++;
+                MipWidth  = (uint32_t)(GMM_ULT_MAX(1, gmmParams.BaseWidth64 >> MipTailStartLod));
+                MipHeight = GMM_ULT_MAX(1, gmmParams.BaseHeight >> MipTailStartLod);
+            }
+        }
+
+        // Mip resource Aligned Width calculation
+        Mip0Width  = GMM_ULT_ALIGN(gmmParams.BaseWidth64, HAlign[i]);
+        Mip0Height = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign[i]);
+
+        if(MipTailStartLod == 1)
+        {
+            EXPECT_EQ(1, ResourceInfo->GetPackedMipTailStartLod());
+            // Block height...Mip0Height + Max(Mip1Height, Sum of Mip2Height..MipnHeight)
+            Mip1Height   = GMM_ULT_ALIGN(gmmParams.BaseHeight >> 1, VAlign[i]);
+            AlignedWidth = Mip0Width;
+        }
+        if(MipTailStartLod == 2)
+        {
+            EXPECT_EQ(2, ResourceInfo->GetPackedMipTailStartLod());
+            // Block height...Mip0Height + Max(Mip1Height, Sum of Mip2Height..MipnHeight)
+            Mip1Height = GMM_ULT_ALIGN(gmmParams.BaseHeight >> 1, VAlign[i]);
+            Mip2Height = Mip2Higher = GMM_ULT_ALIGN(gmmParams.BaseHeight >> 2, VAlign[i]);
+
+            Mip1Width    = GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> 1, HAlign[i]);
+            Mip2Width    = GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> 2, HAlign[i]);
+            AlignedWidth = GMM_ULT_MAX(Mip0Width, Mip1Width + Mip2Width);
+        }
+        if(MipTailStartLod == 3)
+        {
+            EXPECT_EQ(3, ResourceInfo->GetPackedMipTailStartLod());
+            // Block height...Mip0Height + Max(Mip1Height, Sum of Mip2Height..MipnHeight)
+            Mip1Height = GMM_ULT_ALIGN(gmmParams.BaseHeight >> 1, VAlign[i]);
+            Mip2Height = GMM_ULT_ALIGN(gmmParams.BaseHeight >> 2, VAlign[i]);
+            // Miptail started lod
+            MipTailHeight = VAlign[i];
+            Mip2Higher    = Mip2Height + Mip3Height + MipTailHeight;
+
+            Mip1Width    = GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> 1, HAlign[i]);
+            Mip2Width    = GMM_ULT_ALIGN(gmmParams.BaseWidth64 >> 2, HAlign[i]);
+            AlignedWidth = GMM_ULT_MAX(Mip0Width, Mip1Width + Mip2Width);
+        }
+
+        uint32_t MaxHeight = GMM_ULT_MAX(Mip1Height, Mip2Higher);
+        AlignedHeight      = Mip0Height + MaxHeight;
+        AlignedHeight      = GMM_ULT_ALIGN(AlignedHeight, VAlign[i]);
+
+        ExpectedPitch = AlignedWidth * GetBppValue(bpp);
+        ExpectedPitch = GMM_ULT_ALIGN(ExpectedPitch, GMM_BYTES(32));
+        ExpectedPitch = GMM_ULT_ALIGN(ExpectedPitch, TileSize[i][0] * 4); //Only for displayables - 16K pitch align
+        VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+
+        VerifyResourcePitchInTiles<true>(ResourceInfo, static_cast<uint32_t>(ExpectedPitch / TileSize[i][0]));
+        VerifyResourceSize<true>(ResourceInfo, GMM_ULT_ALIGN(ExpectedPitch * AlignedHeight * gmmParams.ArraySize, PAGE_SIZE));
+        VerifyResourceQPitch<false>(ResourceInfo, AlignedHeight);
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        //Aux-size enough to cover all
+        if(const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrLinearCCS)
+        {
+            EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        }
+
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for Linear Buffer Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_TestLinearCompressedResource)
+{
+    // Horizontal pixel alignment
+    const uint32_t MinPitch = 32;
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_BUFFER;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Info.Linear           = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1;
+
+    // Allocate 1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP bpp                             = static_cast<TEST_BPP>(i);
+        gmmParams.Format                         = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64                    = 0x1;
+        gmmParams.BaseHeight                     = 1;
+        gmmParams.Flags.Info.AllowVirtualPadding = (bpp != 8); //OCL uses 8bpp buffers. Specification doesn't comment if Linear buffer compr allowed or not on bpp!=8.
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        uint32_t AlignedWidth = GMM_ULT_ALIGN(gmmParams.BaseWidth64, MinPitch);
+        uint32_t PitchInBytes = AlignedWidth * GetBppValue(bpp);
+        uint32_t AlignedSize  = GMM_ULT_ALIGN(PitchInBytes, PAGE_SIZE);
+
+        VerifyResourceHAlign<false>(ResourceInfo, 0);
+        VerifyResourceVAlign<false>(ResourceInfo, 0);       // N/A for buffer
+        VerifyResourcePitch<false>(ResourceInfo, 0);        // N/A for buffer
+        VerifyResourcePitchInTiles<false>(ResourceInfo, 0); // N/A for linear
+        VerifyResourceSize<true>(ResourceInfo, AlignedSize);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-arrayed
+
+        //test main surface base alignment is 16KB
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+
+    // Allocate more than 1 page
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        TEST_BPP bpp                             = static_cast<TEST_BPP>(i);
+        gmmParams.Format                         = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64                    = 0x1001;
+        gmmParams.BaseHeight                     = 1;
+        gmmParams.Flags.Info.AllowVirtualPadding = (bpp != 8); //OCL uses 8bpp buffers. Specification doesn't comment if Linear buffer compr allowed or not on bpp!=8.
+        gmmParams.Flags.Gpu.UnifiedAuxSurface    = 1;          //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS                  = 1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        uint32_t AlignedWidth = GMM_ULT_ALIGN(gmmParams.BaseWidth64, MinPitch);
+        uint32_t PitchInBytes = AlignedWidth * GetBppValue(bpp);
+        uint32_t AlignedSize  = GMM_ULT_ALIGN(PitchInBytes, PAGE_SIZE);
+
+        VerifyResourceHAlign<false>(ResourceInfo, MinPitch);
+        VerifyResourceVAlign<false>(ResourceInfo, 0);       // N/A for buffer
+        VerifyResourcePitch<false>(ResourceInfo, 0);        // N/A for buffer
+        VerifyResourcePitchInTiles<false>(ResourceInfo, 0); // N/A for linear
+        VerifyResourceSize<true>(ResourceInfo, AlignedSize);
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // N/A for non-arrayed
+
+        //test main surface base alignment is 16KB
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        ASSERT_LE(GMM_ULT_ALIGN(ResourceInfo->GetSizeMainSurface() / (GMM_KBYTE(16) / GMM_BYTES(64)), GMM_KBYTE(4)),
+                  ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+///TODO Add MSAA/Depth Compressed Resource tests
+TEST_F(CTestGen12dGPUResource, DISABLED_TestLosslessMSAACompressedResource)
+{
+}
+
+///TODO Add MSAA/Depth Compressed Resource tests
+TEST_F(CTestGen12dGPUResource, DISABLED_TestDepthCompressedResource)
+{
+    const uint32_t HAlign = 8;
+    uint32_t       VAlign = 4;
+
+    //const uint32_t DepthTileSize[1][2] = { 64, 64 };
+    const uint32_t AllocTileSize[1][2] = {128, 32}; //HiZ is TileY
+
+    GMM_RESCREATE_PARAMS gmmParams         = {};
+    gmmParams.NoGfxMemory                  = 1;
+    gmmParams.Flags.Info.TiledY            = 1; //Not supported for Depth buffer, but HiZ output is TileY
+    gmmParams.Flags.Gpu.Depth              = 1; //GPU Flags= Depth/SeparateStencil + HiZ
+    gmmParams.Flags.Gpu.HiZ                = 1;
+    gmmParams.Flags.Gpu.IndirectClearColor = 1;
+    gmmParams.Flags.Gpu.CCS                = 1;
+    gmmParams.Flags.Info.RenderCompressed  = 1;
+    gmmParams.Flags.Gpu.UnifiedAuxSurface  = 1;
+
+    // Allocate 1x1 surface so that it occupies 1 Tile in X dimension
+    for(uint32_t j = TEST_BPP_8; j <= TEST_BPP_128; j++) //Depth bpp doesn't matter, Depth px dimensions decide HiZ size in HW
+    {
+        {
+            VAlign = (j == TEST_BPP_16) ? 8 : 4;
+        }
+        gmmParams.Format = SetResourceFormat(static_cast<TEST_BPP>(j)); //Only 16,24,32 supported; But driver creates the resource even for other bpps without failing
+        for(uint32_t i = RESOURCE_2D; i <= RESOURCE_CUBE; i++)          //3D doesn't support HiZ - test driver returns proper?
+        {
+            gmmParams.Type        = static_cast<GMM_RESOURCE_TYPE>(i);
+            gmmParams.BaseWidth64 = 0x1;
+            gmmParams.BaseHeight  = 0x1; //0x24; //not 1 tile
+            //gmmParams.MaxLod      = 6; --add expectedheight calc- mip0+max{mip1, sum{mip2,...n}}
+            gmmParams.Depth = 0x1;
+            if(i == RESOURCE_1D || i == RESOURCE_3D)
+            {
+                gmmParams.Flags.Gpu.HiZ = 0;
+            }
+
+            GMM_RESOURCE_INFO *ResourceInfo = NULL;
+            ResourceInfo                    = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            //EXPECT_NE(NULL, ResourceInfo);
+
+            VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+            VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+            uint32_t ExpectedPitch = AllocTileSize[0][0] * 4;
+            VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+            VerifyResourcePitchInTiles<true>(ResourceInfo, 4); // 1 tileY wide
+            uint32_t ExpectedHeight = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign);
+
+            if(gmmParams.ArraySize > 1 || gmmParams.Type == RESOURCE_CUBE)
+            {
+                uint32_t ExpectedQPitch = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign); //Apply formula on Specification
+                ExpectedQPitch          = GMM_ULT_ALIGN(ExpectedQPitch / 2, VAlign);
+                ExpectedHeight *= (gmmParams.Type == RESOURCE_CUBE) ? 6 : 1;
+
+                VerifyResourceQPitch<false>(ResourceInfo, ExpectedQPitch); // Each face should be VAlign rows apart within a tile, Turn on verification after clarity
+            }
+
+            VerifyResourceSize<true>(ResourceInfo,
+                                     GFX_ALIGN(ExpectedPitch * ExpectedHeight, 4 * PAGE_SIZE)); //1 Tile should be enough
+            pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+        }
+
+        // Allocate 2 tiles in X dimension. (muti-tiles Tiles in Y dimension for cube/array)
+        for(uint32_t i = RESOURCE_2D; i <= RESOURCE_CUBE; i++)
+        {
+            gmmParams.Type        = static_cast<GMM_RESOURCE_TYPE>(i);
+            gmmParams.BaseWidth64 = AllocTileSize[0][0] + 0x1;
+            gmmParams.BaseHeight  = (gmmParams.Type == RESOURCE_1D) ? 0x1 :
+                                                                     (gmmParams.Type == RESOURCE_CUBE) ? gmmParams.BaseWidth64 :
+                                                                                                         VAlign / 2;
+            gmmParams.ArraySize = (gmmParams.Type != RESOURCE_3D) ? VAlign : 1; // Gen8 doesn't support 3D-arrays (so HiZ not supported) [test 3d arrays once -- HiZ would fail but ResCreate doesn't?]
+            gmmParams.Depth     = 0x1;
+
+            GMM_RESOURCE_INFO *ResourceInfo;
+            ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+            VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+            VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+            uint32_t ExpectedPitch = GFX_ALIGN(gmmParams.BaseWidth * (int)pow(2, j), AllocTileSize[0][0] * 4);
+            VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+            VerifyResourcePitchInTiles<true>(ResourceInfo, 4); // 2 tileY wide
+
+            uint32_t ExpectedQPitch;
+            if(gmmParams.ArraySize > 1 || gmmParams.Type == RESOURCE_CUBE)
+            {
+                ExpectedQPitch = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign);
+                //ExpectedQPitch = GMM_ULT_ALIGN(ExpectedQPitch / 2, VAlign);
+
+                VerifyResourceQPitch<false>(ResourceInfo, ExpectedQPitch); // Each face should be VAlign rows apart within a tile. Turn on verification after clarity
+            }
+
+            VerifyResourceSize<true>(ResourceInfo, // PitchInBytes * Rows where Rows = (__GMM_MAX_CUBE_FACE x QPitch) /2 (Stencil height = halved due to interleaving), then aligned to tile boundary
+                                     ((gmmParams.Type == RESOURCE_CUBE) ?
+                                      ExpectedPitch * GMM_ULT_ALIGN(ExpectedQPitch * gmmParams.ArraySize * __GMM_MAX_CUBE_FACE, AllocTileSize[0][1]) : //cube
+                                      ((gmmParams.ArraySize > 1) ?
+                                       ExpectedPitch * GMM_ULT_ALIGN(ExpectedQPitch * gmmParams.ArraySize, AllocTileSize[0][1]) : //array
+                                       4 * GMM_KBYTE(4))));
+
+            pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+        }
+
+        // Allocate 2 tiles in X/Y dimension (non-arrayed) Multi-tiles for 3D
+        for(uint32_t i = RESOURCE_2D; i <= RESOURCE_3D; i++)
+        {
+            gmmParams.Type        = static_cast<GMM_RESOURCE_TYPE>(i);
+            gmmParams.BaseWidth64 = AllocTileSize[0][0] + 0x1;
+            gmmParams.BaseHeight  = 2 * AllocTileSize[0][1] + 0x1; //Half-Depth Height or QPitch (lod!=0), aligned to 8 required by HW
+            gmmParams.Depth       = (gmmParams.Type == RESOURCE_2D) ? 0x1 :
+                                                                VAlign + 1;
+            gmmParams.ArraySize = 1;
+
+            GMM_RESOURCE_INFO *ResourceInfo;
+            ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+            VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+            VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+            uint32_t ExpectedPitch = AllocTileSize[0][0] * 4;
+            VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch);
+            VerifyResourcePitchInTiles<true>(ResourceInfo, 4); // 2 tile wide
+
+            uint32_t TwoDQPitch, ExpectedQPitch;
+            if(gmmParams.Type == RESOURCE_3D)
+            {
+                TwoDQPitch     = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign);
+                ExpectedQPitch = gmmParams.Depth * GMM_ULT_ALIGN(TwoDQPitch / 2, VAlign); //Depth slices arranged as 2D-arrayed slices.
+            }
+            else
+            {
+                //HiZ for 3D not supported. Driver still allocates like IVB/HSW. (should Qpitch or only overall buffer height be Valigned ?)
+                VerifyResourceSize<true>(ResourceInfo,
+                                         ((gmmParams.Type == RESOURCE_3D) ?
+                                          ExpectedPitch * GMM_ULT_ALIGN(ExpectedQPitch, AllocTileSize[0][1]) :
+                                          2 * 2 * GMM_KBYTE(4)));
+            }
+            pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+        }
+    }
+}
+
+TEST_F(CTestGen12dGPUResource, DISABLED_TestStencilCompressedResource)
+{
+    const uint32_t HAlign = {16};
+    const uint32_t VAlign = {8};
+
+    const uint32_t TileSize[2] = {128, 32};
+
+    GMM_RESCREATE_PARAMS gmmParams = {};
+    gmmParams.Type                 = RESOURCE_2D;
+    gmmParams.NoGfxMemory          = 1;
+    gmmParams.Flags.Info.TiledY    = 1;
+    //gmmParams.ArraySize = 4;
+
+    gmmParams.Flags.Gpu.SeparateStencil   = 1;
+    gmmParams.Flags.Info.RenderCompressed = 1;
+    // Turn on .MC or .RC flag - mandatory to tell compression-type, for Yf its also used to pad surf
+    // to 4x1 tile
+    // If unifiedAuxSurf reqd (mandatory for displayable or cross-adapter shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+
+    //Allocate 1x1 surface
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface  = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS                = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.IndirectClearColor = 1;
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(TEST_BPP_8);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = 0x1;
+        gmmParams.BaseHeight   = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, 4 * TileSize[0]); // As wide as 4 Tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);        // 4 Tile wide
+        VerifyResourceSize<true>(ResourceInfo, 4 * GMM_KBYTE(4)); // 4 Tile Big
+        VerifyResourceQPitch<false>(ResourceInfo, 0);             // Not Tested
+
+        //test main surface base alignment is 16KB
+        //For Yf test main surface pitch is 4-tileYF aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4); // Check on YF only
+
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X dimension
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(TEST_BPP_8);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = 0x1;
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[0] * 4); // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);        // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4); // 2 tile big, but 4-tile pitch alignment
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // Not tested
+
+        //test main surface base alignment is 16KB
+        //For Y test main surface pitch is 4-tileY aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X/Y dimension
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface  = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS                = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.IndirectClearColor = 1;
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(TEST_BPP_8);
+        GMM_TILE_MODE TileMode = LEGACY_TILE_Y;
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = TileSize[1] + 1;                      // 1 row larger than 1 tile height
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[0] * 4);     // As wide as 2 tile, but 4-tile pitch alignment
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 4);            // 2 tile wide, but 4-tile pitch alignment
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 4 * 2); // 4 tile wide; and 2-tile high
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0); // Not tested
+                                                      //test main surface base alignment is 16KB
+                                                      //For Y test main surface pitch is 4-tileY aligned
+        EXPECT_EQ(GMM_KBYTE(64), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetRenderPitchTiles() % 4);
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+
+/// @brief ULT for 2D TileYf Compressed Resource
+TEST_F(CTestGen12dGPUResource, DISABLED_Test2DTileYfAMFSResource)
+{
+    const uint32_t HAlign[TEST_BPP_MAX] = {64, 64, 32, 32, 16};
+    const uint32_t VAlign[TEST_BPP_MAX] = {64, 32, 32, 16, 16};
+
+    const uint32_t TileSize[TEST_BPP_MAX][2] = {{64, 64},
+                                                {128, 32},
+                                                {128, 32},
+                                                {256, 16},
+                                                {256, 16}};
+
+    GMM_RESCREATE_PARAMS gmmParams        = {};
+    gmmParams.Type                        = RESOURCE_2D;
+    gmmParams.NoGfxMemory                 = 1;
+    gmmParams.Flags.Info.TiledY           = 1;
+    gmmParams.Flags.Info.TiledYf          = 1;
+    gmmParams.Flags.Gpu.Texture           = 1;
+    gmmParams.Flags.Gpu.ProceduralTexture = 1;
+    // If unifiedAuxSurf reqd (mandatory for displayable or cross-adapter shared), turn on .CCS/.MMC and .UnifiedAuxSurface too
+
+    //Allocate 1x1 surface
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+                                                   //gmmParams.Flags.Gpu.MMC = 0;              //Turn on to check unifiedaux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_2D, bpp);
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = 0x1;
+        gmmParams.BaseHeight   = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0]); // As wide as 1 Tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 1);       // 1 Tile wide
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4));    // 1 Tile Big
+        VerifyResourceQPitch<false>(ResourceInfo, 0);            // Not Tested
+
+        //test main surface base alignment is 4KB, since AMFS PT isn't compressed
+        //but uses same linear CCS as compression
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            EXPECT_EQ(0, AuxResourceInfo->GmmGetTileMode());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_2D, bpp);
+
+        gmmParams.Format      = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64 = (TileSize[i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight  = 0x1;
+        gmmParams.Depth       = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0] * 2); // As wide as 2 tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 2);           // 2 tile wide
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 2);    // 2 tile big
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+
+        //test main surface base alignment is 4KB
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            EXPECT_EQ(0, AuxResourceInfo->GmmGetTileMode());
+
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+
+    // Allocate surface that requires multi tiles in two dimension
+    // Allocate 2 tiles in X/Y dimension
+    for(uint32_t i = 0; i < TEST_BPP_MAX; i++)
+    {
+        gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; //Turn off for separate aux creation
+        gmmParams.Flags.Gpu.CCS               = 1; //Turn off for separate aux creation
+
+        TEST_BPP      bpp      = static_cast<TEST_BPP>(i);
+        GMM_TILE_MODE TileMode = DEFINE_TILE(YF_2D, bpp);
+        gmmParams.Format       = SetResourceFormat(bpp);
+        gmmParams.BaseWidth64  = (TileSize[i][0] / GetBppValue(bpp)) + 1; // 1 pixel larger than 1 tile width
+        gmmParams.BaseHeight   = TileSize[i][1] + 1;                      // 1 row larger than 1 tile height
+        gmmParams.Depth        = 0x1;
+
+        GMM_RESOURCE_INFO *ResourceInfo;
+        ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+        VerifyResourceHAlign<true>(ResourceInfo, HAlign[i]);
+        VerifyResourceVAlign<true>(ResourceInfo, VAlign[i]);
+        VerifyResourcePitch<true>(ResourceInfo, TileSize[i][0] * 2);  // As wide as 2 tile
+        VerifyResourcePitchInTiles<true>(ResourceInfo, 2);            // 2 tile wide
+        VerifyResourceSize<true>(ResourceInfo, GMM_KBYTE(4) * 2 * 2); // 2 tile wide; and 2-tile high
+
+        VerifyResourceQPitch<false>(ResourceInfo, 0);
+                                                      //test main surface base alignment is 4KB
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetBaseAlignment());
+        EXPECT_EQ(0, ResourceInfo->GetUnifiedAuxSurfaceOffset(GMM_AUX_CCS) % PAGE_SIZE);
+        EXPECT_EQ(GMM_KBYTE(4), ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS));
+
+        { //separate Aux
+            gmmParams.Flags.Gpu.UnifiedAuxSurface = 0;
+
+            GMM_RESOURCE_INFO *AuxResourceInfo;
+            AuxResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+            EXPECT_EQ(ResourceInfo->GetAuxHAlign(), AuxResourceInfo->GetHAlign());
+            EXPECT_EQ(ResourceInfo->GetAuxVAlign(), AuxResourceInfo->GetVAlign());
+            EXPECT_EQ(ResourceInfo->GetUnifiedAuxPitch(), AuxResourceInfo->GetRenderPitch());
+            EXPECT_EQ(ResourceInfo->GetSizeAuxSurface(GMM_AUX_CCS), AuxResourceInfo->GetSizeSurface());
+            EXPECT_EQ(0, AuxResourceInfo->GmmGetTileMode());
+            pGmmULTClientContext->DestroyResInfoObject(AuxResourceInfo);
+        }
+        pGmmULTClientContext->DestroyResInfoObject(ResourceInfo);
+    }
+}
+
+/// @brief ULT for MSAA Resource - adddepth MSAA, MCS surf param verificaton, compression case
+TEST_F(CTestGen12dGPUResource, DISABLED_TestColorMSAA)
+{
+    //Tile dimensions in Bytes
+    const uint32_t MCSTileSize[1][2] = {128, 32}; //MCS is TileY
+
+    const uint32_t TestDimensions[4][2] = {
+    //Input dimensions in #Tiles
+    {15, 20}, //16 Tiles x 20 <Max Width: Depth MSS crosses Pitch limit beyond this>
+    {0, 0},   //1x1x1
+    {1, 0},   //2 Tilesx1
+    {1, 1},   //2 Tiles x 2
+    };
+
+    uint32_t TestArraySize[2] = {1, 5};
+    uint32_t MinPitch         = 32;
+
+    uint32_t HAlign, VAlign, TileDimX, TileDimY, MCSHAlign, MCSVAlign, TileSize;
+    uint32_t ExpectedMCSBpp;
+    std::vector<tuple<int, int, int, bool, int, int>> List; //TEST_TILE_TYPE, TEST_BPP, TEST_RESOURCE_TYPE, Depth or RT, TestDimension index, ArraySize
+    auto Size = BuildInputIterator(List, 4, 2);             // Size of arrays TestDimensions, TestArraySize
+
+    for(auto element : List)
+    {
+        GMM_RESCREATE_PARAMS gmmParams = {};
+        gmmParams.Flags.Info           = {0};
+
+        TEST_TILE_TYPE     Tiling     = (TEST_TILE_TYPE)std::get<0>(element);
+        TEST_BPP           Bpp        = (TEST_BPP)std::get<1>(element);
+        TEST_RESOURCE_TYPE ResType    = (TEST_RESOURCE_TYPE)std::get<2>(element);
+        bool               IsRT       = std::get<3>(element); // True for RT, False for Depth
+        int                TestDimIdx = std::get<4>(element); //index into TestDimensions array
+        int                ArrayIdx   = std::get<5>(element); //index into TestArraySize
+        TileSize                      = (Tiling == TEST_TILEYS) ? GMM_KBYTE(64) : GMM_KBYTE(4);
+
+        //Discard un-supported Tiling/Res_type/bpp for this test
+        if(ResType != TEST_RESOURCE_2D ||                            //No 1D/3D/Cube. Supported 2D mip-maps/array
+           (!IsRT && (Tiling == TEST_TILEX ||                        //Specifications doesn't support TileX for Depth
+                      !(Bpp == TEST_BPP_16 || Bpp == TEST_BPP_32)))) //depth supported on 16bit, 32bit formats only
+            continue;
+
+        if(!IsRT)
+            continue; //comment depth msaa for now (requires change in h/v align)
+
+        SetTileFlag(gmmParams, Tiling);
+        SetResType(gmmParams, ResType);
+        SetResGpuFlags(gmmParams, IsRT);
+        SetResArraySize(gmmParams, TestArraySize[ArrayIdx]);
+
+        gmmParams.NoGfxMemory = 1;
+        gmmParams.Format      = SetResourceFormat(Bpp);
+        for(uint32_t k = MSAA_2x; k <= MSAA_16x; k++)
+        {
+            GetAlignmentAndTileDimensionsForMSAA(Bpp, IsRT, Tiling, (TEST_MSAA)k,
+                                                 TileDimX, TileDimY, HAlign, VAlign,
+                                                 ExpectedMCSBpp, MCSHAlign, MCSVAlign);
+
+            //gmmParams.BaseWidth64 = TestDimensions[TestDimIdx][0] * TileDimX + 0x1;
+            //gmmParams.BaseHeight = TestDimensions[TestDimIdx][1] * TileDimY + 0x1;
+            gmmParams.BaseWidth64     = 4;
+            gmmParams.BaseHeight      = 4;
+            gmmParams.Depth           = 0x1;
+            gmmParams.MSAA.NumSamples = static_cast<uint32_t>(pow((double)2, k));
+            gmmParams.Flags.Gpu.MCS   = 0;
+
+            //MSS surface
+            GMM_RESOURCE_INFO *MSSResourceInfo;
+            MSSResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams);
+
+            if(MSSResourceInfo)
+            {
+                VerifyResourceHAlign<true>(MSSResourceInfo, HAlign);
+                VerifyResourceVAlign<true>(MSSResourceInfo, VAlign);
+                if(IsRT) //Arrayed MSS
+                {
+                    uint32_t ExpectedPitch = 0, ExpectedQPitch = 0;
+                    ExpectedPitch = GMM_ULT_ALIGN(GMM_ULT_ALIGN(gmmParams.BaseWidth64, HAlign) * (int)pow(2.0, Bpp), TileDimX); // Aligned width * bpp, aligned to TileWidth
+                    ExpectedPitch = GFX_MAX(ExpectedPitch, MinPitch);
+                    VerifyResourcePitch<true>(MSSResourceInfo, ExpectedPitch);
+                    if(Tiling != TEST_LINEAR)
+                        VerifyResourcePitchInTiles<true>(MSSResourceInfo, ExpectedPitch / TileDimX);
+
+                    ExpectedQPitch = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign);
+                    if(gmmParams.ArraySize > 1) //Gen9: Qpitch is distance between array slices (not sample slices)
+                    {
+                        VerifyResourceQPitch<true>(MSSResourceInfo, ExpectedQPitch);
+                    }
+
+                    uint32_t ExpectedHeight = GMM_ULT_ALIGN(ExpectedQPitch * gmmParams.MSAA.NumSamples * gmmParams.ArraySize, TileDimY); //Align Height =ExpectedPitch * NumSamples * ExpectedQPitch, to Tile-Height
+                    VerifyResourceSize<true>(MSSResourceInfo, GMM_ULT_ALIGN(ExpectedPitch * ExpectedHeight, TileSize));
+                }
+            }
+
+            pGmmULTClientContext->DestroyResInfoObject(MSSResourceInfo);
+        } //NumSamples = k
+    }     //Iterate through all Input types
+
+    //Mip-mapped, MSAA case:
+}
diff --git a/Source/GmmLib/ULT/GmmGen12dGPUResourceULT.h b/Source/GmmLib/ULT/GmmGen12dGPUResourceULT.h
new file mode 100644
index 0000000..71ea4e1
--- /dev/null
+++ b/Source/GmmLib/ULT/GmmGen12dGPUResourceULT.h
@@ -0,0 +1,39 @@
+/*==============================================================================
+Copyright(c) 2020 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and / or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+============================================================================*/
+#pragma once
+
+#include "GmmGen10ResourceULT.h"
+#include "../GmmLib/inc/Internal/Common/Platform/GmmGen12Platform.h"
+
+class CTestGen12dGPUResource : public CTestGen10Resource
+{
+public:
+    static void SetUpTestCase();
+    static void TearDownTestCase();
+};
+
+#define DEFINE_TILE(xxx, bpp)                                                                                       \
+    (bpp == TEST_BPP_8) ? TILE_##xxx##_8bpe :                                                                       \
+                          (bpp == TEST_BPP_16) ? TILE_##xxx##_16bpe :                                               \
+                                                 (bpp == TEST_BPP_32) ? TILE_##xxx##_32bpe :                        \
+                                                                        (bpp == TEST_BPP_64) ? TILE_##xxx##_64bpe : \
+                                                                                               TILE_##xxx##_128bpe
diff --git a/Source/GmmLib/Utility/GmmLibObject.cpp b/Source/GmmLib/Utility/GmmLibObject.cpp
index af3c287..64a0416 100644
--- a/Source/GmmLib/Utility/GmmLibObject.cpp
+++ b/Source/GmmLib/Utility/GmmLibObject.cpp
@@ -28,6 +28,7 @@
 #include "External/Common/CachePolicy/GmmCachePolicyGen10.h"
 #include "External/Common/CachePolicy/GmmCachePolicyGen11.h"
 #include "External/Common/CachePolicy/GmmCachePolicyGen12.h"
+#include "External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h"
 #include "Internal/Common/Texture/GmmTextureCalc.h"
 #include "Internal/Common/Texture/GmmGen10TextureCalc.h"
 #include "Internal/Common/Texture/GmmGen11TextureCalc.h"
@@ -104,7 +105,14 @@
 
     if (GFX_GET_CURRENT_RENDERCORE(pGmmGlobalContext->GetPlatformInfo().Platform) >= IGFX_GEN12_CORE)
     {
-        pGmmCachePolicy = new GmmLib::GmmGen12CachePolicy(CachePolicy);
+        if(pGmmGlobalContext->GetSkuTable().FtrLocalMemory)
+        {
+            pGmmCachePolicy = new GmmLib::GmmGen12dGPUCachePolicy(CachePolicy);
+        }
+        else
+        {
+            pGmmCachePolicy = new GmmLib::GmmGen12CachePolicy(CachePolicy);
+        }
     }
     else if(GFX_GET_CURRENT_RENDERCORE(pGmmGlobalContext->GetPlatformInfo().Platform) >= IGFX_GEN11_CORE)
     {
@@ -174,4 +182,4 @@
             return new GmmGen12TextureCalc();
             break;
     }
-}
\ No newline at end of file
+}
diff --git a/Source/GmmLib/inc/External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h b/Source/GmmLib/inc/External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h
new file mode 100644
index 0000000..71ecfbc
--- /dev/null
+++ b/Source/GmmLib/inc/External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h
@@ -0,0 +1,49 @@
+/*==============================================================================
+Copyright(c) 2020 Intel Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and / or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+============================================================================*/
+#pragma once
+
+#ifdef __cplusplus
+#include "../GmmCachePolicyCommon.h"
+
+namespace GmmLib
+{
+    class NON_PAGED_SECTION GmmGen12dGPUCachePolicy :
+        public GmmGen12CachePolicy
+    {
+        public:
+
+            /* Constructors */
+            GmmGen12dGPUCachePolicy(GMM_CACHE_POLICY_ELEMENT *pCachePolicy):GmmGen12CachePolicy(pCachePolicy)
+            {
+            }
+            virtual ~GmmGen12dGPUCachePolicy()
+            {
+            }
+
+            /* Function prototypes */
+            GMM_STATUS InitCachePolicy();
+            void       SetUpMOCSTable();
+            int32_t    IsSpecialMOCSUsage(GMM_RESOURCE_USAGE_TYPE Usage, bool& UpdateMOCS);
+
+    };
+}
+#endif // #ifdef __cplusplus
diff --git a/Source/GmmLib/inc/Internal/Common/GmmLibInc.h b/Source/GmmLib/inc/Internal/Common/GmmLibInc.h
index 9f7d9e5..c0f1085 100644
--- a/Source/GmmLib/inc/Internal/Common/GmmLibInc.h
+++ b/Source/GmmLib/inc/Internal/Common/GmmLibInc.h
@@ -39,6 +39,7 @@
 #include "External/Common/CachePolicy/GmmCachePolicyGen10.h"
 #include "External/Common/CachePolicy/GmmCachePolicyGen11.h"
 #include "External/Common/CachePolicy/GmmCachePolicyGen12.h"
+#include "External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h"
 #include "External/Common/GmmResourceInfoExt.h"
 #include "../Platform/GmmPlatforms.h"
 #include "Platform/GmmGen8Platform.h"
@@ -68,4 +69,4 @@
 #define D3DKMT_CROSS_ADAPTER_RESOURCE_PITCH_ALIGNMENT   128
 #define D3DKMT_CROSS_ADAPTER_RESOURCE_HEIGHT_ALIGNMENT   4
 
-#endif
\ No newline at end of file
+#endif
diff --git a/Source/inc/common/igfxfmid.h b/Source/inc/common/igfxfmid.h
index c0d4c29..1bab786 100644
--- a/Source/inc/common/igfxfmid.h
+++ b/Source/inc/common/igfxfmid.h
@@ -66,6 +66,7 @@
     IGFX_JASPERLAKE,
     IGFX_ELKHARTLAKE     =IGFX_JASPERLAKE,
     IGFX_TIGERLAKE_LP,
+    IGFX_DG1             = 1210,
     IGFX_MAX_PRODUCT,
 
 
@@ -270,6 +271,10 @@
 #define GFX_GET_CURRENT_PRODUCT(p)     ( (p).eProductFamily )
 #define GFX_GET_CURRENT_DISPLAYCORE(p) ( (p).eDisplayCoreFamily )
 #define GFX_GET_CURRENT_RENDERCORE(p)  ( (p).eRenderCoreFamily )
+
+// This macro returns true if the product family is discrete
+#define GFX_IS_DISCRETE_FAMILY(p)      ( ( GFX_GET_CURRENT_PRODUCT(p) == IGFX_DG1 ) )
+
 // These macros return true/false depending on the current render family.
 #define GFX_IS_NAPA_RENDER_FAMILY(p)   ( ( GFX_GET_CURRENT_RENDERCORE(p) == IGFX_GEN3_CORE )    ||   \
                                          ( GFX_GET_CURRENT_RENDERCORE(p) == IGFX_GEN3_5_CORE ) )
@@ -1175,6 +1180,8 @@
 #define ITGL_LP_1x2x16_DESK_WS_65W_DEVICE_F0_ID 0x9A78      // Desktop WS- S81 - 35W/65W/95W
 #define ITGL_LP_GT0_ULT_DEVICE_F0_ID            0x9A7F      // GT0 - No GFX, Display Only
 
+#define DEV_ID_4905                             0x4905
+
 //LKF
 #define ILKF_1x8x8_DESK_DEVICE_F0_ID            0x9840
 #define ILKF_GT0_DESK_DEVICE_A0_ID              0x9850
diff --git a/Source/inc/common/sku_wa.h b/Source/inc/common/sku_wa.h
index 0e78b97..160de6c 100644
--- a/Source/inc/common/sku_wa.h
+++ b/Source/inc/common/sku_wa.h
@@ -98,6 +98,7 @@
         unsigned int   FtrDriverFLR                     : 1;  // Enable Function Level Reset (Gen11+)
         unsigned int   FtrLocalMemory                   : 1;
         unsigned int   FtrCameraCaptureCaching          : 1;
+        unsigned int   FtrLocalMemoryAllows4KB          : 1;
    };