Use DLL interfaces for ULT

Adding two Exported APIs in DLL - GmmInit and GmmDestroy.
GmmInit initializes singleton global context and ClientContext.
This avoid the need for clients to fill up function table.

Change-Id: I3bab29d2c10fd4d06cf78e1f33c9479d536477da
Signed-off-by: drprajap <dimpalben.r.prajapati@intel.com>
diff --git a/Source/GmmLib/GlobalInfo/GmmClientContext.cpp b/Source/GmmLib/GlobalInfo/GmmClientContext.cpp
index 591f804..36cdf1a 100644
--- a/Source/GmmLib/GlobalInfo/GmmClientContext.cpp
+++ b/Source/GmmLib/GlobalInfo/GmmClientContext.cpp
@@ -190,6 +190,18 @@
 }
 
 /////////////////////////////////////////////////////////////////////////////////////
+/// Member function of ClientContext class for getting Alignment info
+///
+/// @return     void
+//////////////////////////////////////////////////////////////////////////////////
+void GMM_STDCALL GmmLib::GmmClientContext::GetExtendedTextureAlign(uint32_t Mode, ALIGNMENT &UnitAlign)
+{
+    ALIGNMENT AlignInfo;
+    pGmmGlobalContext->GetPlatformInfoObj()->ApplyExtendedTexAlign(Mode, AlignInfo);
+    UnitAlign = AlignInfo;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
 /// Member function of ClientContext class for returning whether the given Resource
 /// format is Planar
 ///
diff --git a/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp b/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp
index 174818d..14c14f8 100755
--- a/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp
+++ b/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp
@@ -84,4 +84,47 @@
     return Status;
 }
 
+/////////////////////////////////////////////////////////////////////////////////////
+/// First Call to GMM Lib DLL/so to initialize singleton global context
+/// and create client context
+///
+/////////////////////////////////////////////////////////////////////////////////////
+#ifdef _WIN32
+extern "C" GMM_LIB_API GMM_CLIENT_CONTEXT *GMM_STDCALL GmmInit(const PLATFORM           Platform,
+                                                               const SKU_FEATURE_TABLE *pSkuTable,
+                                                               const WA_TABLE *         pWaTable,
+                                                               const GT_SYSTEM_INFO *   pGtSysInfo,
+                                                               GMM_CLIENT               ClientType)
+#else
+extern "C" GMM_LIB_API GMM_CLIENT_CONTEXT *GMM_STDCALL GmmInit(const PLATFORM Platform,
+                                                               const void *   pSkuTable,
+                                                               const void *   pWaTable,
+                                                               const void *   pGtSysInfo,
+                                                               GMM_CLIENT     ClientType)
 #endif
+{
+    GMM_STATUS          Status         = GMM_SUCCESS;
+    GMM_CLIENT_CONTEXT *pClientContext = NULL;
+
+
+    Status = GmmCreateSingletonContext(Platform, pSkuTable, pWaTable, pGtSysInfo);
+
+    if(Status == GMM_SUCCESS)
+    {
+        pClientContext = GmmCreateClientContext(ClientType);
+    }
+
+    return pClientContext;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////
+/// Destroys singleton global context and client context
+///
+/////////////////////////////////////////////////////////////////////////////////////
+extern "C" GMM_LIB_API void GMM_STDCALL GmmDestroy(GMM_CLIENT_CONTEXT *pGmmClientContext)
+{
+    GmmDestroySingletonContext();
+    GmmDeleteClientContext(pGmmClientContext);
+}
+#endif // GMM_LIB_DLL
diff --git a/Source/GmmLib/ULT/CMakeLists.txt b/Source/GmmLib/ULT/CMakeLists.txt
index 47c63fd..3432374 100644
--- a/Source/GmmLib/ULT/CMakeLists.txt
+++ b/Source/GmmLib/ULT/CMakeLists.txt
@@ -21,17 +21,17 @@
 set (EXE_NAME GMMULT)
 
 set(GMMULT_HEADERS
-    GmmCachePolicyULT.h
-    GmmCommonULT.h
-    GmmGen10CachePolicyULT.h
-    GmmGen10ResourceULT.h
-    GmmGen11CachePolicyULT.h
-    GmmGen9CachePolicyULT.h
-    GmmGen9ResourceULT.h
-    GmmResourceULT.h
-    stdafx.h
-    targetver.h
-)
+     GmmCachePolicyULT.h
+     GmmCommonULT.h
+     GmmGen10CachePolicyULT.h
+     GmmGen10ResourceULT.h
+     GmmGen11CachePolicyULT.h
+     GmmGen9CachePolicyULT.h
+     GmmGen9ResourceULT.h
+     GmmResourceULT.h
+     stdafx.h
+     targetver.h
+     )
 
 set(GMMULT_SOURCES
     GmmCachePolicyULT.cpp
@@ -48,36 +48,36 @@
 )
 
 source_group("Source Files\\Cache Policy" FILES
-    GmmCachePolicyULT.cpp
-    GmmGen9CachePolicyULT.cpp
-    GmmGen10CachePolicyULT.cpp
-    GmmGen11CachePolicyULT.cpp
-)
+            GmmCachePolicyULT.cpp
+            GmmGen9CachePolicyULT.cpp
+            GmmGen10CachePolicyULT.cpp
+            GmmGen11CachePolicyULT.cpp
+            )
 
 source_group("Source Files\\Resource" FILES
-    GmmGen10ResourceULT.cpp
-    GmmGen9ResourceULT.cpp
-    GmmResourceCpuBltULT.cpp
-    GmmResourceULT.cpp
-)
+            GmmGen10ResourceULT.cpp
+            GmmGen9ResourceULT.cpp
+            GmmResourceCpuBltULT.cpp
+            GmmResourceULT.cpp
+            )
 
 source_group("Header Files\\Cache Policy" FILES
-    GmmCachePolicyULT.h
-    GmmGen10CachePolicyULT.h
-    GmmGen11CachePolicyULT.h
-    GmmGen9CachePolicyULT.h
-)
+             GmmCachePolicyULT.h
+             GmmGen10CachePolicyULT.h
+             GmmGen11CachePolicyULT.h
+             GmmGen9CachePolicyULT.h
+            )
 
 source_group("Header Files\\Resource" FILES
-    GmmGen10ResourceULT.h
-    GmmGen9ResourceULT.h
-    GmmResourceULT.h
-)
+             GmmGen10ResourceULT.h
+             GmmGen9ResourceULT.h
+             GmmResourceULT.h
+            )
 
 source_group("gtest" FILES
-    googletest/gtest/gtest.h
-    googletest/src/gtest-all.cc
-)
+            googletest/gtest/gtest.h
+            googletest/src/gtest-all.cc
+            )
 
 include_directories(BEFORE ./)
 
@@ -90,37 +90,62 @@
     ${BS_DIR_INC}
     ${BS_DIR_GMMLIB}/inc
     ${BS_DIR_INC}/common
-)
+    )
 
 if(MSVC)
+
     include_directories(
-      ${BS_DIR_D3D11}/Imola
+        ${BS_DIR_D3D11}/Imola
     )
 endif()
 
+macro(GmmLibULTSetTargetConfig ultTarget)
+	if (TARGET ${ultTarget})
+			set_property(TARGET ${ultTarget} APPEND PROPERTY COMPILE_DEFINITIONS
+				$<$<CONFIG:Release>: _RELEASE>
+				$<$<CONFIG:ReleaseInternal>: _RELEASE_INTERNAL>
+				$<$<CONFIG:Debug>: _DEBUG>
+			)
+		endif()
+
+endmacro()
+
 add_executable(${EXE_NAME} ${GMMULT_HEADERS} ${GMMULT_SOURCES})
 
+GmmLibULTSetTargetConfig(${EXE_NAME})
+
+
 if(MSVC)
     bs_set_wdk(${EXE_NAME})
-endif()
 
-set_property(TARGET ${EXE_NAME} APPEND PROPERTY COMPILE_DEFINITIONS __GMM GMM_EXCITE)
+    set_property(TARGET ${EXE_NAME} APPEND PROPERTY COMPILE_DEFINITIONS __GMM GMM_LIB_DLL GMM_ULT __UMD)
 
-target_link_libraries(${EXE_NAME}
-    igfx_gmmumd_excite
+    add_dependencies(${EXE_NAME}
+					 igfx_gmmumd_dll
 )
 
-if(MSVC)
     target_link_libraries( ${EXE_NAME}
-    advapi32.lib
-    dxgi.lib
-    gdi32.lib
-    opengl32.lib
-    user32.lib
-)
+        advapi32.lib
+        dxgi.lib
+        gdi32.lib
+        opengl32.lib
+        user32.lib
+    )
 else()
+    set_property(TARGET ${EXE_NAME} APPEND PROPERTY COMPILE_DEFINITIONS __GMM GMM_EXCITE __UMD)
+
     target_link_libraries(${EXE_NAME}
-      pthread
+        igfx_gmmumd_excite
+    )
+
+#	if(NOT TARGET igfx_gmmumd_dll)
+#		add_subdirectory("${BS_DIR_GMMLIB}" "${CMAKE_BINARY_DIR}/gmmlib/ult")
+#	endif()
+#	target_link_libraries(${EXE_NAME} igfx_gmmumd_dll)
+
+    target_link_libraries(${EXE_NAME}
+        pthread
+		dl
     )
  endif()
 
@@ -133,5 +158,3 @@
     COMMAND ${EXE_NAME}  --gtest_filter=CTest*
 )
 
-
-
diff --git a/Source/GmmLib/ULT/GmmCachePolicyULT.cpp b/Source/GmmLib/ULT/GmmCachePolicyULT.cpp
index b2a7206..335c6f0 100644
--- a/Source/GmmLib/ULT/GmmCachePolicyULT.cpp
+++ b/Source/GmmLib/ULT/GmmCachePolicyULT.cpp
@@ -22,7 +22,6 @@
 
 #include "GmmCachePolicyULT.h"
 
-extern GMM_GLOBAL_CONTEXT *pGmmGlobalContext;
 using namespace std;
 
 /////////////////////////////////////////////////////////////////////////////////////
@@ -35,6 +34,12 @@
 {
     GfxPlatform.eProductFamily    = IGFX_BROADWELL;
     GfxPlatform.eRenderCoreFamily = IGFX_GEN8_CORE;
+    AllocateAdapterInfo();
+
+    pGfxAdapterInfo->SystemInfo.L3CacheSizeInKb                         = 768;
+    pGfxAdapterInfo->SystemInfo.LLCCacheSizeInKb                        = 2 * 1024;  //2 MB
+    pGfxAdapterInfo->SystemInfo.EdramSizeInKb                           = 64 * 1024; //64 MB
+    const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrEDram = 1;
 
     CommonULT::SetUpTestCase();
 
@@ -55,21 +60,12 @@
 
 void CTestCachePolicy::CheckL3CachePolicy()
 {
-    ASSERT_TRUE(pGmmGlobalContext);
-
     const uint32_t TargetCache_L3_LLC_ELLC = 0x3;
 
-
-    // Setup SKU/WA flags
-    pGmmGlobalContext->GetGtSysInfo()->L3CacheSizeInKb = 768; //768 KB
-
-    // Re-init cache policy based on above info
-    pGmmGlobalContext->GetCachePolicyObj()->InitCachePolicy();
-
     // 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 = pGmmGlobalContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
+        GMM_CACHE_POLICY_ELEMENT    ClientRequest = pGmmULTClientContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
         MEMORY_OBJECT_CONTROL_STATE Mocs          = ClientRequest.MemoryObjectOverride;
 
         // Not check WT/WB/UC since that doesn't really matter for L3
@@ -89,8 +85,6 @@
 
 void CTestCachePolicy::CheckLlcEdramCachePolicy()
 {
-    ASSERT_TRUE(pGmmGlobalContext);
-
     const uint32_t TargetCache_ELLC        = 0;
     const uint32_t TargetCache_LLC         = 1;
     const uint32_t TargetCache_LLC_ELLC    = 2;
@@ -100,18 +94,10 @@
     const uint32_t CC_CACHED_WT = 0x2;
     const uint32_t CC_CACHED_WB = 0x3;
 
-    // Setup SKU/WA flags
-    pGmmGlobalContext->GetGtSysInfo()->LLCCacheSizeInKb                        = 2 * 1024;  //2 MB
-    pGmmGlobalContext->GetGtSysInfo()->EdramSizeInKb                           = 64 * 1024; //64 MB
-    const_cast<SKU_FEATURE_TABLE &>(pGmmGlobalContext->GetSkuTable()).FtrEDram = 1;
-
-    // Re-init cache policy with above info
-    pGmmGlobalContext->GetCachePolicyObj()->InitCachePolicy();
-
     // 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 = pGmmGlobalContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
+        GMM_CACHE_POLICY_ELEMENT    ClientRequest = pGmmULTClientContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
         MEMORY_OBJECT_CONTROL_STATE Mocs          = ClientRequest.MemoryObjectOverride;
 
         // Check for age
@@ -119,7 +105,6 @@
 
         if(ClientRequest.L3)
         {
-            // Already tested in another test
             continue;
         }
 
diff --git a/Source/GmmLib/ULT/GmmCommonULT.cpp b/Source/GmmLib/ULT/GmmCommonULT.cpp
index 595aa62..14b79a2 100644
--- a/Source/GmmLib/ULT/GmmCommonULT.cpp
+++ b/Source/GmmLib/ULT/GmmCommonULT.cpp
@@ -21,10 +21,34 @@
 ============================================================================*/
 
 #include "GmmCommonULT.h"
+#ifndef _WIN32
+#include <dlfcn.h>
+#endif
 
 ADAPTER_INFO *      CommonULT::pGfxAdapterInfo      = NULL;
 PLATFORM            CommonULT::GfxPlatform          = {};
 GMM_CLIENT_CONTEXT *CommonULT::pGmmULTClientContext = NULL;
+PFNGMMINIT          CommonULT::pfnGmmInit           = {0};
+PFNGMMDESTROY       CommonULT::pfnGmmDestroy        = {0};
+#ifdef _WIN32
+    HINSTANCE       CommonULT::hGmmLib              = NULL;
+#else
+    void           *CommonULT::hGmmLib              = NULL;
+#endif
+
+void CommonULT::AllocateAdapterInfo()
+{
+    if(!pGfxAdapterInfo)
+    {
+        pGfxAdapterInfo = (ADAPTER_INFO *)malloc(sizeof(ADAPTER_INFO));
+        if(!pGfxAdapterInfo)
+        {
+            ASSERT_TRUE(false);
+            return;
+        }
+        memset(pGfxAdapterInfo, 0, sizeof(ADAPTER_INFO));
+    }
+}
 
 void CommonULT::SetUpTestCase()
 {
@@ -37,16 +61,24 @@
         GfxPlatform.eRenderCoreFamily = IGFX_GEN8_CORE;
     }
 
-    if(!pGfxAdapterInfo)
-    {
-        pGfxAdapterInfo = (ADAPTER_INFO *)malloc(sizeof(ADAPTER_INFO));
-        if(!pGfxAdapterInfo)
-        {
-            ASSERT_TRUE(false);
-            return;
-        }
-        memset(pGfxAdapterInfo, 0, sizeof(ADAPTER_INFO));
-    }
+    AllocateAdapterInfo();
+
+#ifdef GMM_LIB_DLL
+    hGmmLib = dlopen(GMM_UMD_DLL, RTLD_LAZY);
+    ASSERT_TRUE(hGmmLib);
+
+    *(void **)(&pfnGmmInit)    = dlsym(hGmmLib, "GmmInit");
+    *(void **)(&pfnGmmDestroy) = dlsym(hGmmLib, "GmmDestroy");
+
+    ASSERT_TRUE(pfnGmmInit);
+    ASSERT_TRUE(pfnGmmDestroy);
+
+    pGmmULTClientContext = pfnGmmInit(GfxPlatform,
+                                      &pGfxAdapterInfo->SkuTable,
+                                      &pGfxAdapterInfo->WaTable,
+                                      &pGfxAdapterInfo->SystemInfo,
+                                      GMM_EXCITE_VISTA);
+#else
 
     GMM_STATUS GmmStatus = GmmInitGlobalContext(GfxPlatform,
                                                 &pGfxAdapterInfo->SkuTable,
@@ -57,14 +89,29 @@
     ASSERT_EQ(GmmStatus, GMM_SUCCESS);
 
     pGmmULTClientContext = GmmCreateClientContext(GMM_EXCITE_VISTA);
+#endif // GMM_LIB_DLL
+
     ASSERT_TRUE(pGmmULTClientContext);
 }
 
 void CommonULT::TearDownTestCase()
 {
     printf("%s\n", __FUNCTION__);
+
+#ifdef GMM_LIB_DLL
+    pfnGmmDestroy(static_cast<GMM_CLIENT_CONTEXT *>(pGmmULTClientContext));
+
+    if(hGmmLib)
+    {
+        dlclose(hGmmLib);
+    }
+#else
     GmmDeleteClientContext(pGmmULTClientContext);
     GmmDestroyGlobalContext();
+#endif
+
+    hGmmLib              = NULL;
+    pGmmULTClientContext = NULL;
     free(pGfxAdapterInfo);
     pGfxAdapterInfo = NULL;
     GfxPlatform     = {};
diff --git a/Source/GmmLib/ULT/GmmCommonULT.h b/Source/GmmLib/ULT/GmmCommonULT.h
index cacf7b7..d62e3d3 100644
--- a/Source/GmmLib/ULT/GmmCommonULT.h
+++ b/Source/GmmLib/ULT/GmmCommonULT.h
@@ -24,20 +24,41 @@
 
 #include "stdafx.h"
 
-extern GMM_GLOBAL_CONTEXT *pGmmGlobalContext;
+typedef GMM_CLIENT_CONTEXT *(GMM_STDCALL * PFNGMMINIT)
+#ifdef _WIN32
+    (const PLATFORM,
+    const SKU_FEATURE_TABLE *,
+    const WA_TABLE *,
+    const GT_SYSTEM_INFO *,
+    GMM_CLIENT);
+#else
+    (const PLATFORM Platform,
+    const void *   pSkuTable,
+    const void *   pWaTable,
+    const void *   pGtSysInfo,
+    GMM_CLIENT ClientType);
+#endif
+typedef void(GMM_STDCALL *PFNGMMDESTROY)(GMM_CLIENT_CONTEXT *);
 
 class CommonULT : public testing::Test
 {
 public:
     static void SetUpTestCase();
     static void TearDownTestCase();
+    static void AllocateAdapterInfo();
 
 protected:
     static ADAPTER_INFO *pGfxAdapterInfo;
     static PLATFORM GfxPlatform;
-    //static GMM_GLOBAL_CONTEXT *pGmmGlobalContext;   // TODO: when GlobalContext class initialization is in place we will replace global vairable and
-                                                      // extern for pGmmGlobalContext with local class instance initialized by ULT.
 
-    static GMM_CLIENT_CONTEXT              *pGmmULTClientContext; ///< GMM ClientContext need for GMM ULT
+    static GMM_CLIENT_CONTEXT              *pGmmULTClientContext;
+    static PFNGMMINIT                       pfnGmmInit;
+    static PFNGMMDESTROY                    pfnGmmDestroy;
+
+    #ifdef _WIN32
+        static HINSTANCE                     hGmmLib;
+    #else
+        static void                         *hGmmLib;
+    #endif
 
 };
diff --git a/Source/GmmLib/ULT/GmmGen11CachePolicyULT.cpp b/Source/GmmLib/ULT/GmmGen11CachePolicyULT.cpp
index fa4baa5..5f60a6f 100644
--- a/Source/GmmLib/ULT/GmmGen11CachePolicyULT.cpp
+++ b/Source/GmmLib/ULT/GmmGen11CachePolicyULT.cpp
@@ -34,6 +34,12 @@
 {
     GfxPlatform.eProductFamily    = IGFX_ICELAKE;
     GfxPlatform.eRenderCoreFamily = IGFX_GEN11_CORE;
+    AllocateAdapterInfo();
+
+    pGfxAdapterInfo->SystemInfo.L3CacheSizeInKb                         = 3072;
+    pGfxAdapterInfo->SystemInfo.LLCCacheSizeInKb                        = 2 * 1024;   //2 MB
+    pGfxAdapterInfo->SystemInfo.EdramSizeInKb                           = 128 * 1024; //128 MB
+    const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrEDram = 1;
 
     CommonULT::SetUpTestCase();
 
@@ -54,23 +60,15 @@
 
 void CTestGen11CachePolicy::CheckL3CachePolicy()
 {
-    ASSERT_TRUE(pGmmGlobalContext);
-
     const uint32_t L3_WB_CACHEABLE = 0x3;
     const uint32_t L3_UNCACHEABLE  = 0x1;
 
-    // Setup SKU/WA flags
-    pGmmGlobalContext->GetGtSysInfo()->L3CacheSizeInKb = 3072; //768 KB
-
-    // Re-init cache policy based on above info
-    pGmmGlobalContext->GetCachePolicyObj()->InitCachePolicy();
-
     // 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   = pGmmGlobalContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
-        uint32_t                        AssignedMocsIdx = ClientRequest.MemoryObjectOverride.Gen11.Index;
-        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmGlobalContext->GetCachePolicyTlbElement()[AssignedMocsIdx];
+        GMM_CACHE_POLICY_ELEMENT     ClientRequest   = pGmmULTClientContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
+        uint32_t                     AssignedMocsIdx = ClientRequest.MemoryObjectOverride.Gen11.Index;
+        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmULTClientContext->GetCachePolicyTlbElement(AssignedMocsIdx);
 
         EXPECT_EQ(0, Mocs.L3.ESC) << "Usage# " << Usage << ": ESC is non-zero";
         EXPECT_EQ(0, Mocs.L3.SCC) << "Usage# " << Usage << ": SCC is non-zero";
@@ -109,8 +107,6 @@
 
 void CTestGen11CachePolicy::CheckLlcEdramCachePolicy()
 {
-    ASSERT_TRUE(pGmmGlobalContext);
-
     const uint32_t TargetCache_ELLC     = 0;
     const uint32_t TargetCache_LLC      = 1;
     const uint32_t TargetCache_LLC_ELLC = 2;
@@ -119,17 +115,12 @@
     const uint32_t LeCC_WB_CACHEABLE = 0x3;
     const uint32_t LeCC_WT_CACHEABLE = 0x2;
 
-    const_cast<SKU_FEATURE_TABLE &>(pGmmGlobalContext->GetSkuTable()).FtrEDram = 0;
-
-    // Re-init cache policy with above info
-    pGmmGlobalContext->GetCachePolicyObj()->InitCachePolicy();
-
     // 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   = pGmmGlobalContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
-        uint32_t                        AssignedMocsIdx = ClientRequest.MemoryObjectOverride.Gen11.Index;
-        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmGlobalContext->GetCachePolicyTlbElement()[AssignedMocsIdx];
+        GMM_CACHE_POLICY_ELEMENT     ClientRequest   = pGmmULTClientContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
+        uint32_t                     AssignedMocsIdx = ClientRequest.MemoryObjectOverride.Gen11.Index;
+        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmULTClientContext->GetCachePolicyTlbElement(AssignedMocsIdx);
 
         // Check for unused fields
         EXPECT_EQ(0, Mocs.LeCC.AOM) << "Usage# " << Usage << ": AOM is non-zero";
diff --git a/Source/GmmLib/ULT/GmmGen9CachePolicyULT.cpp b/Source/GmmLib/ULT/GmmGen9CachePolicyULT.cpp
index 4600a1c..cdf6364 100644
--- a/Source/GmmLib/ULT/GmmGen9CachePolicyULT.cpp
+++ b/Source/GmmLib/ULT/GmmGen9CachePolicyULT.cpp
@@ -35,6 +35,13 @@
     GfxPlatform.eProductFamily    = IGFX_SKYLAKE;
     GfxPlatform.eRenderCoreFamily = IGFX_GEN9_CORE;
 
+    AllocateAdapterInfo();
+
+    pGfxAdapterInfo->SystemInfo.L3CacheSizeInKb                         = 768;
+    pGfxAdapterInfo->SystemInfo.LLCCacheSizeInKb                        = 2 * 1024;   //2 MB
+    pGfxAdapterInfo->SystemInfo.EdramSizeInKb                           = 128 * 1024; //128 MB
+    const_cast<SKU_FEATURE_TABLE &>(pGfxAdapterInfo->SkuTable).FtrEDram = 1;
+
     CommonULT::SetUpTestCase();
 
     printf("%s\n", __FUNCTION__);
@@ -54,23 +61,15 @@
 
 void CTestGen9CachePolicy::CheckL3CachePolicy()
 {
-    ASSERT_TRUE(pGmmGlobalContext);
-
     const uint32_t L3_WB_CACHEABLE = 0x3;
     const uint32_t L3_UNCACHEABLE  = 0x1;
 
-    // Setup SKU/WA flags
-    pGmmGlobalContext->GetGtSysInfo()->L3CacheSizeInKb = 768; //768 KB
-
-    // Re-init cache policy based on above info
-    pGmmGlobalContext->GetCachePolicyObj()->InitCachePolicy();
-
     // 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   = pGmmGlobalContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
+        GMM_CACHE_POLICY_ELEMENT     ClientRequest   = pGmmULTClientContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
         uint32_t                     AssignedMocsIdx = ClientRequest.MemoryObjectOverride.Gen9.Index;
-        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmGlobalContext->GetCachePolicyTlbElement()[AssignedMocsIdx];
+        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmULTClientContext->GetCachePolicyTlbElement(AssignedMocsIdx);
 
         EXPECT_EQ(0, Mocs.L3.ESC) << "Usage# " << Usage << ": ESC is non-zero";
         EXPECT_EQ(0, Mocs.L3.SCC) << "Usage# " << Usage << ": SCC is non-zero";
@@ -96,8 +95,6 @@
 
 void CTestGen9CachePolicy::CheckLlcEdramCachePolicy()
 {
-    ASSERT_TRUE(pGmmGlobalContext);
-
     const uint32_t TargetCache_ELLC     = 0;
     const uint32_t TargetCache_LLC      = 1;
     const uint32_t TargetCache_LLC_ELLC = 2;
@@ -105,20 +102,12 @@
     const uint32_t LeCC_UNCACHEABLE  = 0x1;
     const uint32_t LeCC_WB_CACHEABLE = 0x3;
 
-    // Setup SKU/WA flags
-    pGmmGlobalContext->GetGtSysInfo()->LLCCacheSizeInKb                        = 2 * 1024;   //2 MB
-    pGmmGlobalContext->GetGtSysInfo()->EdramSizeInKb                           = 128 * 1024; //128 MB
-    const_cast<SKU_FEATURE_TABLE &>(pGmmGlobalContext->GetSkuTable()).FtrEDram = 1;
-
-    // Re-init cache policy with above info
-    pGmmGlobalContext->GetCachePolicyObj()->InitCachePolicy();
-
     // 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   = pGmmGlobalContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
+        GMM_CACHE_POLICY_ELEMENT     ClientRequest   = pGmmULTClientContext->GetCachePolicyElement((GMM_RESOURCE_USAGE_TYPE)Usage);
         uint32_t                     AssignedMocsIdx = ClientRequest.MemoryObjectOverride.Gen9.Index;
-        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmGlobalContext->GetCachePolicyTlbElement()[AssignedMocsIdx];
+        GMM_CACHE_POLICY_TBL_ELEMENT Mocs            = pGmmULTClientContext->GetCachePolicyTlbElement(AssignedMocsIdx);
 
         // Check for unused fields
         EXPECT_EQ(0, Mocs.LeCC.AOM) << "Usage# " << Usage << ": AOM is non-zero";
diff --git a/Source/GmmLib/ULT/GmmGen9ResourceULT.cpp b/Source/GmmLib/ULT/GmmGen9ResourceULT.cpp
index 14c6f1e..d8adb95 100644
--- a/Source/GmmLib/ULT/GmmGen9ResourceULT.cpp
+++ b/Source/GmmLib/ULT/GmmGen9ResourceULT.cpp
@@ -3382,9 +3382,9 @@
 
     uint32_t TestArraySize[2] = {1, 5};
 
-    uint32_t HAlign = 0, VAlign = 0, TileDimX = 0;
-    uint32_t TileDimY = 0, MCSHAlign = 0, MCSVAlign = 0, TileSize = 0;
-    uint32_t ExpectedMCSBpp = 0;
+    uint32_t HAlign = 0, VAlign = 0, TileDimX = 0, TileDimY = 0;
+    uint32_t MCSHAlign = 0, MCSVAlign = 0, TileSize = 0;
+    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
 
diff --git a/Source/GmmLib/ULT/stdafx.h b/Source/GmmLib/ULT/stdafx.h
index 2cc051c..9a89212 100644
--- a/Source/GmmLib/ULT/stdafx.h
+++ b/Source/GmmLib/ULT/stdafx.h
@@ -59,7 +59,8 @@
 #include "../inc/External/Common/GmmInfoExt.h"
 #include "../inc/External/Common/GmmInfo.h"
 #include "../inc/External/Common/GmmClientContext.h"
-
+#include "../inc/External/Common/GmmLibDll.h"
+#include "../inc/External/Common/GmmLibDllName.h"
 
 #ifdef __cplusplus
 }
diff --git a/Source/GmmLib/inc/External/Common/GmmClientContext.h b/Source/GmmLib/inc/External/Common/GmmClientContext.h
index d76ee0d..43b9367 100644
--- a/Source/GmmLib/inc/External/Common/GmmClientContext.h
+++ b/Source/GmmLib/inc/External/Common/GmmClientContext.h
@@ -103,6 +103,7 @@
         GMM_VIRTUAL GMM_CACHE_POLICY_ELEMENT            GMM_STDCALL GetCachePolicyElement(GMM_RESOURCE_USAGE_TYPE Usage);
         GMM_VIRTUAL GMM_CACHE_POLICY_TBL_ELEMENT        GMM_STDCALL GetCachePolicyTlbElement(uint32_t  MocsIdx);
         GMM_VIRTUAL GMM_PLATFORM_INFO&                  GMM_STDCALL GetPlatformInfo();
+        GMM_VIRTUAL void                                GMM_STDCALL GetExtendedTextureAlign(uint32_t Mode, ALIGNMENT &UnitAlign);
 
         GMM_VIRTUAL uint8_t                             GMM_STDCALL IsPlanar(GMM_RESOURCE_FORMAT Format);
         GMM_VIRTUAL uint8_t                             GMM_STDCALL IsP0xx(GMM_RESOURCE_FORMAT Format);
diff --git a/Source/GmmLib/inc/External/Common/GmmLibDllName.h b/Source/GmmLib/inc/External/Common/GmmLibDllName.h
index 29dcac8..fd3090a 100755
--- a/Source/GmmLib/inc/External/Common/GmmLibDllName.h
+++ b/Source/GmmLib/inc/External/Common/GmmLibDllName.h
@@ -22,19 +22,24 @@
 #pragma once
 
 #if defined(_WIN64 ) || defined(__x86_64__) || defined(__LP64__)
-    #define GMM_ENTRY_NAME  "OpenGmm"
+    #define GMM_ENTRY_NAME      "OpenGmm"
+    #define GMM_INIT_NAME       "GmmInit"
+    #define GMM_DESTROY_NAME    "GmmDestroy"
 
-    #if defined(_WIN64 )
+    #if defined(_WIN64)
         #define GMM_UMD_DLL     "igdgmm64.dll"
     #else
         #define GMM_UMD_DLL     "libigdgmm.so"
     #endif
 #else
-    #define GMM_ENTRY_NAME  "_OpenGmm@4"
+    #define GMM_ENTRY_NAME      "_OpenGmm@4"
+
+    #define GMM_INIT_NAME       "_GmmInit@48"
+    #define GMM_DESTROY_NAME    "_GmmDestroy@4"
 
     #if defined(_WIN32)
         #define GMM_UMD_DLL     "igdgmm32.dll"
     #else
         #define GMM_UMD_DLL     "libigdgmm.so"
     #endif
-#endif
\ No newline at end of file
+#endif