Skip to content

Commit 8325c56

Browse files
authored
Fix to resolve Media and NEO sharing issue with Xe2compression on BMG (#226)
1 parent 9104c20 commit 8325c56

File tree

9 files changed

+129
-20
lines changed

9 files changed

+129
-20
lines changed

Source/GmmLib/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ project(igfx_gmmumd)
2525

2626
# GmmLib Api Version used for so naming
2727
set(GMMLIB_API_MAJOR_VERSION 12)
28-
set(GMMLIB_API_MINOR_VERSION 6)
28+
set(GMMLIB_API_MINOR_VERSION 7)
2929

3030
if(NOT DEFINED MAJOR_VERSION)
3131
set(MAJOR_VERSION 12)
3232
endif()
3333

3434
if(NOT DEFINED MINOR_VERSION)
35-
set(MINOR_VERSION 6)
35+
set(MINOR_VERSION 7)
3636
endif()
3737

3838
if(NOT DEFINED PATCH_VERSION)

Source/GmmLib/GlobalInfo/GmmClientContext.cpp

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,34 @@ extern GMM_MA_LIB_CONTEXT *pGmmMALibContext;
3939
/////////////////////////////////////////////////////////////////////////////////////
4040
GmmLib::GmmClientContext::GmmClientContext(GMM_CLIENT ClientType, Context *pLibContext)
4141
: ClientType(),
42-
pUmdAdapter(),
42+
pClientContextAilFlags(),
4343
pGmmUmdContext(),
4444
DeviceCB(),
4545
IsDeviceCbReceived(0)
4646
{
4747
this->ClientType = ClientType;
4848
this->pGmmLibContext = pLibContext;
49+
50+
if (NULL != (pClientContextAilFlags = (GMM_AIL_STRUCT *)malloc(sizeof(GMM_AIL_STRUCT))))
51+
{
52+
memset(pClientContextAilFlags, 0, sizeof(GMM_AIL_STRUCT));
53+
}
54+
else
55+
{
56+
pClientContextAilFlags = NULL;
57+
}
4958
}
5059
/////////////////////////////////////////////////////////////////////////////////////
5160
/// Destructor to free GmmLib::GmmClientContext object memory
5261
/////////////////////////////////////////////////////////////////////////////////////
5362
GmmLib::GmmClientContext::~GmmClientContext()
5463
{
5564
pGmmLibContext = NULL;
65+
if (pClientContextAilFlags)
66+
{
67+
free(pClientContextAilFlags);
68+
pClientContextAilFlags = NULL;
69+
}
5670
}
5771

5872
/////////////////////////////////////////////////////////////////////////////////////
@@ -128,6 +142,35 @@ uint8_t GMM_STDCALL GmmLib::GmmClientContext::GetSurfaceStateL1CachePolicy(GMM_R
128142
return pGmmLibContext->GetCachePolicyObj()->GetSurfaceStateL1CachePolicy(Usage);
129143
}
130144

145+
////////////////////////////////////////////////////////////////////////////////////
146+
/// Member function to get the AIL flags associated with Client Context
147+
/// @param[in] None
148+
/// @return GMM_AIL_STRUCT associated with the ClientContext
149+
150+
const uint64_t* GMM_STDCALL GmmLib::GmmClientContext::GmmGetAIL()
151+
{
152+
return (uint64_t*)(this->pClientContextAilFlags);
153+
}
154+
155+
////////////////////////////////////////////////////////////////////////////////////
156+
/// Member function to Set the AIL flags associated with Client Context
157+
///
158+
/// @param[in] GMM_AIL_STRUCT: Pointer to AIL struct
159+
/// @return void
160+
void GMM_STDCALL GmmLib::GmmClientContext::GmmSetAIL(GMM_AIL_STRUCT* pAilFlags)
161+
{
162+
//Cache the AilXe2CompressionRequest value
163+
bool IsClientAilXe2Compression = this->pClientContextAilFlags->AilDisableXe2CompressionRequest;
164+
165+
memcpy(this->pClientContextAilFlags, pAilFlags, sizeof(GMM_AIL_STRUCT));
166+
167+
// Update the Current ClientContext flags with whatever was cached earlier before copy
168+
this->pClientContextAilFlags->AilDisableXe2CompressionRequest = IsClientAilXe2Compression;
169+
170+
return;
171+
}
172+
173+
131174
/////////////////////////////////////////////////////////////////////////////////////
132175
/// Member function of ClientContext class to return Swizzle Descriptor
133176
/// given Swizzle name , ResType and bpe
@@ -952,19 +995,34 @@ GMM_STATUS GMM_STDCALL GmmLib::GmmClientContext::GmmSetDeviceInfo(GMM_DEVICE_INF
952995
/// @see Class GmmLib::GmmClientContext
953996
///
954997
/// @param[in] ClientType : describles the UMD clients such as OCL, DX, OGL, Vulkan etc
955-
/// @param[in] sBDF: Adapter's BDF info
998+
/// @param[in] sBDF: Adapter's BDF info@param[in] sBDF: Adapter's BDF info
999+
/// @param[in] _pSkuTable: SkuTable Pointer
9561000
///
9571001
/// @return Pointer to GmmClientContext, if Context is created
9581002
/////////////////////////////////////////////////////////////////////////////////////
959-
extern "C" GMM_CLIENT_CONTEXT *GMM_STDCALL GmmCreateClientContextForAdapter(GMM_CLIENT ClientType,
960-
ADAPTER_BDF sBdf)
1003+
extern "C" GMM_CLIENT_CONTEXT *GMM_STDCALL GmmCreateClientContextForAdapter(GMM_CLIENT ClientType,
1004+
ADAPTER_BDF sBdf,
1005+
const void *_pSkuTable)
9611006
{
9621007
GMM_CLIENT_CONTEXT *pGmmClientContext = nullptr;
9631008
GMM_LIB_CONTEXT * pLibContext = pGmmMALibContext->GetAdapterLibContext(sBdf);
1009+
SKU_FEATURE_TABLE *pSkuTable;
9641010

9651011
if (pLibContext)
9661012
{
9671013
pGmmClientContext = new GMM_CLIENT_CONTEXT(ClientType, pLibContext);
1014+
1015+
if (pGmmClientContext)
1016+
{
1017+
pSkuTable = (SKU_FEATURE_TABLE *)_pSkuTable;
1018+
if (GFX_GET_CURRENT_RENDERCORE(pLibContext->GetPlatformInfo().Platform) >= IGFX_XE2_HPG_CORE && pLibContext->GetSkuTable().FtrXe2Compression && !pSkuTable->FtrXe2Compression)
1019+
{
1020+
1021+
GMM_AIL_STRUCT *pClientAilFlags = (GMM_AIL_STRUCT *)pGmmClientContext->GmmGetAIL();
1022+
1023+
pClientAilFlags->AilDisableXe2CompressionRequest = true;
1024+
}
1025+
}
9681026

9691027
}
9701028
return pGmmClientContext;

Source/GmmLib/GlobalInfo/GmmInfo.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,16 @@ GMM_CLIENT ClientType)
10051005
this->SkuTable = *pSkuTable;
10061006
this->WaTable = *pWaTable;
10071007
this->GtSysInfo = *pGtSysInfo;
1008-
1008+
1009+
if (GFX_GET_CURRENT_RENDERCORE(Platform) >= IGFX_XE2_HPG_CORE && (pSkuTable->FtrXe2Compression == false))
1010+
{
1011+
this->SkuTable.FtrXe2Compression = true;
1012+
if (!(this->GetSkuTable().FtrFlatPhysCCS) || !(this->GetSkuTable().FtrE2ECompression))
1013+
{
1014+
SkuTable.FtrXe2Compression = false;
1015+
}
1016+
}
1017+
10091018
this->pPlatformInfo = CreatePlatformInfo(Platform, false);
10101019
if(this->pPlatformInfo == NULL)
10111020
{

Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ extern "C" GMM_LIB_API GMM_STATUS GMM_STDCALL InitializeGmm(GMM_INIT_IN_ARGS *pI
5959

6060
if(Status == GMM_SUCCESS)
6161
{
62-
pOutArgs->pGmmClientContext = GmmCreateClientContextForAdapter(pInArgs->ClientType,
63-
stAdapterBDF);
62+
pOutArgs->pGmmClientContext = GmmCreateClientContextForAdapter(pInArgs->ClientType,
63+
stAdapterBDF, pInArgs->pSkuTable);
6464
}
6565

6666
#endif

Source/GmmLib/Resource/GmmResourceInfoCommon.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,9 @@ GMM_STATUS GMM_STDCALL GmmLib::GmmResourceInfoCommon::Create(Context &GmmLibCont
500500
if(GetGmmLibContext()->GetSkuTable().FtrFlatPhysCCS && AuxSurf.Type == RESOURCE_INVALID)
501501
{
502502
//ie only AuxType is CCS, doesn't exist with FlatCCS, enable it for CC
503-
if (!GetGmmLibContext()->GetSkuTable().FtrXe2Compression || (GetGmmLibContext()->GetSkuTable().FtrXe2Compression && (Surf.MSAA.NumSamples > 1)))
503+
if (!GetGmmLibContext()->GetSkuTable().FtrXe2Compression || (GetGmmLibContext()->GetSkuTable().FtrXe2Compression &&
504+
(!(((GMM_AIL_STRUCT *)(GetGmmClientContext()->GmmGetAIL()))->AilDisableXe2CompressionRequest)) &&
505+
(Surf.MSAA.NumSamples > 1)))
504506
{
505507
AuxSurf.Type = Surf.Type;
506508
}

Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,18 @@ uint8_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::ValidateParams()
673673
}
674674
}
675675

676+
#ifndef __GMM_KMD__
677+
if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression && (GetGmmClientContext() != NULL))
678+
{
679+
if (((GMM_AIL_STRUCT *)(GetGmmClientContext()->GmmGetAIL()))->AilDisableXe2CompressionRequest)
680+
{
681+
//Disable Compression at resource level only, However at adapter level FtrXe2Compression could be still enabled.
682+
//AilDisableXe2CompressionRequest helps us to acheive this.
683+
Surf.Flags.Info.NotCompressed = 1;
684+
}
685+
}
686+
#endif
687+
676688
if((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) < IGFX_GEN8_CORE) &&
677689
Surf.Flags.Info.TiledW)
678690
{

Source/GmmLib/inc/External/Common/GmmClientContext.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,12 @@ namespace GmmLib
8181
protected:
8282
GMM_CLIENT ClientType;
8383
///< Placeholders for storing UMD context. Actual UMD context that needs to be stored here is
84-
void *pUmdAdapter;
85-
GMM_UMD_CONTEXT *pGmmUmdContext;
84+
union
85+
{
86+
void *pUmdAdapter;
87+
GMM_AIL_STRUCT *pClientContextAilFlags; //To store the UMD AIL flags. This is applicable for each client. Used to populate the corresponding LibContextAilFlags
88+
};
89+
GMM_UMD_CONTEXT *pGmmUmdContext;
8690
GMM_DEVICE_CALLBACKS_INT DeviceCB; //OS-specific defn: Will be used by Clients to send as input arguments.
8791
// Flag to indicate Device_callbacks received.
8892
uint8_t IsDeviceCbReceived;
@@ -177,6 +181,9 @@ namespace GmmLib
177181
#endif
178182
GMM_VIRTUAL uint32_t GMM_STDCALL CachePolicyGetPATIndex(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage, bool *pCompressionEnable, bool IsCpuCacheable);
179183
GMM_VIRTUAL const SWIZZLE_DESCRIPTOR *GMM_STDCALL GetSwizzleDesc(EXTERNAL_SWIZZLE_NAME ExternalSwizzleName, EXTERNAL_RES_TYPE ResType, uint8_t bpe, bool isStdSwizzle = false);
184+
185+
GMM_VIRTUAL void GMM_STDCALL GmmSetAIL(GMM_AIL_STRUCT *pAilFlags);
186+
GMM_VIRTUAL const uint64_t *GMM_STDCALL GmmGetAIL();
180187
};
181188
}
182189

@@ -188,14 +195,13 @@ typedef struct GmmClientContext GMM_CLIENT_CONTEXT;
188195

189196
#endif
190197

191-
192-
193198
#ifdef __cplusplus
194199
extern "C" {
195200
#endif
196201

197202
/* ClientContext will be unique to each client */
198-
GMM_CLIENT_CONTEXT* GMM_STDCALL GmmCreateClientContextForAdapter(GMM_CLIENT ClientType, ADAPTER_BDF sBdf);
203+
GMM_CLIENT_CONTEXT *GMM_STDCALL GmmCreateClientContextForAdapter(GMM_CLIENT ClientType,
204+
ADAPTER_BDF sBdf, const void *_pSkuTable);
199205
void GMM_STDCALL GmmDeleteClientContext(GMM_CLIENT_CONTEXT *pGmmClientContext);
200206

201207
#if GMM_LIB_DLL

Source/GmmLib/inc/External/Common/GmmCommonExt.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,3 +681,17 @@ typedef enum GMM_RESOURCE_TYPE_ENUM
681681
GMM_MAX_HW_RESOURCE_TYPE
682682
} GMM_RESOURCE_TYPE;
683683

684+
typedef struct
685+
{
686+
union
687+
{
688+
struct
689+
{
690+
uint64_t AilDisableXe2CompressionRequest: 1;
691+
uint64_t reserved: 63;
692+
693+
};
694+
695+
uint64_t Value;
696+
};
697+
} GMM_AIL_STRUCT;

Source/GmmLib/inc/External/Common/GmmResourceInfoCommon.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,8 +1160,13 @@ namespace GmmLib
11601160
else if ((GmmAuxType == GMM_AUX_CC) && (Surf.Flags.Gpu.IndirectClearColor || Surf.Flags.Gpu.ColorDiscard))
11611161
{
11621162
Offset = Surf.Size + AuxSurf.UnpaddedSize;
1163-
if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
1164-
{
1163+
1164+
if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression
1165+
#ifndef __GMM_KMD__
1166+
&& !(((GMM_AIL_STRUCT *)(GetGmmClientContext()->GmmGetAIL()))->AilDisableXe2CompressionRequest)
1167+
#endif
1168+
)
1169+
{
11651170
if (Surf.MSAA.NumSamples > 1)
11661171
{
11671172
Offset = Surf.Size; // Beginning of MCS which is first 4K of AuxSurf, Clear colour is stored only for MSAA surfaces
@@ -1248,9 +1253,12 @@ namespace GmmLib
12481253
}
12491254
else
12501255
{
1251-
1252-
if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
1253-
{
1256+
if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression
1257+
#ifndef __GMM_KMD__
1258+
&& !(((GMM_AIL_STRUCT *)(GetGmmClientContext()->GmmGetAIL()))->AilDisableXe2CompressionRequest)
1259+
#endif
1260+
)
1261+
{
12541262
if (Surf.MSAA.NumSamples > 1)
12551263
{
12561264
return (AuxSurf.UnpaddedSize); // CC is part of MCS

0 commit comments

Comments
 (0)