xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker 
23*35ffd701SAndroid Build Coastguard Worker 
24*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
25*35ffd701SAndroid Build Coastguard Worker 
26*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
27*35ffd701SAndroid Build Coastguard Worker /// Copies parameters or sets flags based on info sent by the client.
28*35ffd701SAndroid Build Coastguard Worker ///
29*35ffd701SAndroid Build Coastguard Worker /// @param[in]  CreateParams: Flags which specify what sort of resource to create
30*35ffd701SAndroid Build Coastguard Worker /// @return     false if encountered invalid param. true otherwise.
31*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CopyClientParams(GMM_RESCREATE_PARAMS & CreateParams)32*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmResourceInfoCommon::CopyClientParams(GMM_RESCREATE_PARAMS &CreateParams)
33*35ffd701SAndroid Build Coastguard Worker {
34*35ffd701SAndroid Build Coastguard Worker     uint32_t BitsPerPixel;
35*35ffd701SAndroid Build Coastguard Worker     uint8_t  Optimize64KBTile = 0;
36*35ffd701SAndroid Build Coastguard Worker 
37*35ffd701SAndroid Build Coastguard Worker     if((CreateParams.Format > GMM_FORMAT_INVALID) &&
38*35ffd701SAndroid Build Coastguard Worker        (CreateParams.Format < GMM_RESOURCE_FORMATS))
39*35ffd701SAndroid Build Coastguard Worker     {
40*35ffd701SAndroid Build Coastguard Worker         BitsPerPixel = GetGmmLibContext()->GetPlatformInfo().FormatTable[CreateParams.Format].Element.BitsPer;
41*35ffd701SAndroid Build Coastguard Worker     }
42*35ffd701SAndroid Build Coastguard Worker     else
43*35ffd701SAndroid Build Coastguard Worker     {
44*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Format Error");
45*35ffd701SAndroid Build Coastguard Worker         return false;
46*35ffd701SAndroid Build Coastguard Worker     }
47*35ffd701SAndroid Build Coastguard Worker     {
48*35ffd701SAndroid Build Coastguard Worker         // Promote tiling options if caller does not provide any.
49*35ffd701SAndroid Build Coastguard Worker         // X/Y/W/L are tiling formats, and Yf/Ys are modifiers to the internal
50*35ffd701SAndroid Build Coastguard Worker         // ordering for Y and L macro-formats.
51*35ffd701SAndroid Build Coastguard Worker         if((CreateParams.Flags.Info.Linear +
52*35ffd701SAndroid Build Coastguard Worker             CreateParams.Flags.Info.TiledW +
53*35ffd701SAndroid Build Coastguard Worker             CreateParams.Flags.Info.TiledX +
54*35ffd701SAndroid Build Coastguard Worker             CreateParams.Flags.Info.TiledY) == 0)
55*35ffd701SAndroid Build Coastguard Worker         {
56*35ffd701SAndroid Build Coastguard Worker             if(CreateParams.Type == RESOURCE_1D ||
57*35ffd701SAndroid Build Coastguard Worker                CreateParams.Type == RESOURCE_BUFFER ||
58*35ffd701SAndroid Build Coastguard Worker                CreateParams.Type == RESOURCE_SCRATCH ||
59*35ffd701SAndroid Build Coastguard Worker                CreateParams.Flags.Info.ExistingSysMem)
60*35ffd701SAndroid Build Coastguard Worker             {
61*35ffd701SAndroid Build Coastguard Worker                 CreateParams.Flags.Info.Linear = true;
62*35ffd701SAndroid Build Coastguard Worker             }
63*35ffd701SAndroid Build Coastguard Worker 
64*35ffd701SAndroid Build Coastguard Worker             if(GetGmmLibContext()->GetSkuTable().FtrTileY)
65*35ffd701SAndroid Build Coastguard Worker             {
66*35ffd701SAndroid Build Coastguard Worker 
67*35ffd701SAndroid Build Coastguard Worker                 CreateParams.Flags.Info.TiledYs |= CreateParams.Flags.Info.StdSwizzle || CreateParams.Flags.Gpu.TiledResource;
68*35ffd701SAndroid Build Coastguard Worker 
69*35ffd701SAndroid Build Coastguard Worker                 // Propose L+Y by default.
70*35ffd701SAndroid Build Coastguard Worker                 CreateParams.Flags.Info.Linear = true;
71*35ffd701SAndroid Build Coastguard Worker                 CreateParams.Flags.Info.TiledY = true;
72*35ffd701SAndroid Build Coastguard Worker 
73*35ffd701SAndroid Build Coastguard Worker                 // Pre-Gen11 Planar
74*35ffd701SAndroid Build Coastguard Worker                 if(GmmIsPlanar(CreateParams.Format) && (GFX_GET_CURRENT_RENDERCORE(GetGmmLibContext()->GetPlatformInfo().Platform) < IGFX_GEN11_CORE))
75*35ffd701SAndroid Build Coastguard Worker                 {
76*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.TiledX = true;
77*35ffd701SAndroid Build Coastguard Worker                 }
78*35ffd701SAndroid Build Coastguard Worker             }
79*35ffd701SAndroid Build Coastguard Worker             //Auto-tiling selection if not Linear already
80*35ffd701SAndroid Build Coastguard Worker             else if(CreateParams.Flags.Info.Linear == 0)
81*35ffd701SAndroid Build Coastguard Worker              {
82*35ffd701SAndroid Build Coastguard Worker                 // Xe_HP onwards.
83*35ffd701SAndroid Build Coastguard Worker                 if((CreateParams.Flags.Info.TiledYs +
84*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.TiledYf +
85*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.Tile4 +
86*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.Tile64) == 0)
87*35ffd701SAndroid Build Coastguard Worker                 {
88*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(!CreateParams.Flags.Info.StdSwizzle, "StdSwizzle not supported on current platform");
89*35ffd701SAndroid Build Coastguard Worker 
90*35ffd701SAndroid Build Coastguard Worker                     if(!GetGmmLibContext()->GetSkuTable().FtrForceTile4) // FtrForceTile4 should never be set by default, used for debug purpose only
91*35ffd701SAndroid Build Coastguard Worker                     {
92*35ffd701SAndroid Build Coastguard Worker                         // Default Tiling is set to Tile64 on FtrTileY disabled platforms
93*35ffd701SAndroid Build Coastguard Worker                         uint8_t IsYUVSurface = GmmIsPlanar(CreateParams.Format) ||
94*35ffd701SAndroid Build Coastguard Worker                                                 (GmmIsYUVPacked(CreateParams.Format));
95*35ffd701SAndroid Build Coastguard Worker 
96*35ffd701SAndroid Build Coastguard Worker                         //YCRCB* formats
97*35ffd701SAndroid Build Coastguard Worker                         uint8_t IsYCrCbSurface = ((CreateParams.Format == GMM_FORMAT_YCRCB_NORMAL) ||
98*35ffd701SAndroid Build Coastguard Worker                                                   (CreateParams.Format == GMM_FORMAT_YCRCB_SWAPUV) ||
99*35ffd701SAndroid Build Coastguard Worker                                                   (CreateParams.Format == GMM_FORMAT_YCRCB_SWAPUVY) || (CreateParams.Format == GMM_FORMAT_YCRCB_SWAPY));
100*35ffd701SAndroid Build Coastguard Worker 
101*35ffd701SAndroid Build Coastguard Worker 			CreateParams.Flags.Info.Tile4 = ((!GMM_IS_SUPPORTED_BPP_ON_TILE_64_YF_YS(BitsPerPixel)) ||            // 24,48,96 bpps are not supported on Tile64, Tile4 is bpp independent
102*35ffd701SAndroid Build Coastguard Worker                                                          ((CreateParams.Type == RESOURCE_3D) && (CreateParams.Flags.Gpu.Depth || CreateParams.Flags.Gpu.SeparateStencil)) ||
103*35ffd701SAndroid Build Coastguard Worker                                                          ((!GetGmmLibContext()->GetSkuTable().FtrDisplayDisabled) &&
104*35ffd701SAndroid Build Coastguard Worker                                                           (CreateParams.Flags.Gpu.FlipChain || CreateParams.Flags.Gpu.Overlay)
105*35ffd701SAndroid Build Coastguard Worker                                                           ) ||
106*35ffd701SAndroid Build Coastguard Worker 							  IsYUVSurface || IsYCrCbSurface);
107*35ffd701SAndroid Build Coastguard Worker 
108*35ffd701SAndroid Build Coastguard Worker 			CreateParams.Flags.Info.Tile64 = !CreateParams.Flags.Info.Tile4;
109*35ffd701SAndroid Build Coastguard Worker                         // Optimize only when GMM makes tiling decision on behalf of UMD clients.
110*35ffd701SAndroid Build Coastguard Worker                         // Defering the memory calculations until GMM_TEXTURE_INFO  is available.
111*35ffd701SAndroid Build Coastguard Worker                         if(CreateParams.Flags.Info.Tile64)
112*35ffd701SAndroid Build Coastguard Worker                         {
113*35ffd701SAndroid Build Coastguard Worker                             Optimize64KBTile = 1;
114*35ffd701SAndroid Build Coastguard Worker                         }
115*35ffd701SAndroid Build Coastguard Worker 		    }
116*35ffd701SAndroid Build Coastguard Worker                     else
117*35ffd701SAndroid Build Coastguard Worker                     {
118*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.Tile64 = (CreateParams.MSAA.NumSamples > 1) || CreateParams.Flags.Gpu.TiledResource; // Colour & Depth/Stencil(IMS) MSAA should use Tile64
119*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.Tile4  = !CreateParams.Flags.Info.Tile64;
120*35ffd701SAndroid Build Coastguard Worker                     }
121*35ffd701SAndroid Build Coastguard Worker                 }
122*35ffd701SAndroid Build Coastguard Worker                 else if((CreateParams.Flags.Info.TiledYs +
123*35ffd701SAndroid Build Coastguard Worker                          CreateParams.Flags.Info.TiledYf) > 0)
124*35ffd701SAndroid Build Coastguard Worker                 {
125*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(0, "Tile Yf/Ys not supported on given platform");
126*35ffd701SAndroid Build Coastguard Worker 
127*35ffd701SAndroid Build Coastguard Worker                     // Overrides the flags.
128*35ffd701SAndroid Build Coastguard Worker                     if(GetGmmLibContext()->GetSkuTable().FtrForceTile4)// FtrForceTile4 should never be set by default, used for debug purpose only.
129*35ffd701SAndroid Build Coastguard Worker                     {
130*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.Tile64 = CreateParams.Flags.Info.TiledYs ||
131*35ffd701SAndroid Build Coastguard Worker                                                          (CreateParams.MSAA.NumSamples > 1) || CreateParams.Flags.Gpu.TiledResource; // Colour & Depth/Stencil(IMS) MSAA should use Tile64
132*35ffd701SAndroid Build Coastguard Worker 
133*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.Tile4   = !CreateParams.Flags.Info.Tile64;
134*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.TiledYf = 0;
135*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.TiledYs = 0;
136*35ffd701SAndroid Build Coastguard Worker                     }
137*35ffd701SAndroid Build Coastguard Worker                 }
138*35ffd701SAndroid Build Coastguard Worker             }
139*35ffd701SAndroid Build Coastguard Worker         }
140*35ffd701SAndroid Build Coastguard Worker         //Convert non linear & non-tiledX tiling selection by client to proper tiling.
141*35ffd701SAndroid Build Coastguard Worker         else if(CreateParams.Flags.Info.Linear + CreateParams.Flags.Info.TiledX == 0)
142*35ffd701SAndroid Build Coastguard Worker          {
143*35ffd701SAndroid Build Coastguard Worker             if(!GetGmmLibContext()->GetSkuTable().FtrTileY)
144*35ffd701SAndroid Build Coastguard Worker             {
145*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(!(CreateParams.Flags.Info.TiledYs ||
146*35ffd701SAndroid Build Coastguard Worker                                CreateParams.Flags.Info.TiledYf ||
147*35ffd701SAndroid Build Coastguard Worker                                CreateParams.Flags.Info.TiledY));
148*35ffd701SAndroid Build Coastguard Worker 
149*35ffd701SAndroid Build Coastguard Worker                 // On Xe_HP onwards translate UMD's TileY/TileYs request to Tile4/Tile64 respectively
150*35ffd701SAndroid Build Coastguard Worker                 // Exclude TileX, Linear from override
151*35ffd701SAndroid Build Coastguard Worker                 if((GetGmmLibContext()->GetSkuTable().FtrForceTile4) && (CreateParams.Flags.Info.TiledYs || CreateParams.Flags.Info.TiledY))
152*35ffd701SAndroid Build Coastguard Worker                 {
153*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.Tile64 =
154*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.TiledYs ||
155*35ffd701SAndroid Build Coastguard Worker                     (CreateParams.MSAA.NumSamples > 1) || CreateParams.Flags.Gpu.TiledResource;
156*35ffd701SAndroid Build Coastguard Worker 
157*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.Tile4 = !CreateParams.Flags.Info.Tile64;
158*35ffd701SAndroid Build Coastguard Worker 
159*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.TiledY  = 0;
160*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.TiledYs = 0;
161*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.TiledW  = 0;
162*35ffd701SAndroid Build Coastguard Worker                     CreateParams.Flags.Info.TiledYf = 0;
163*35ffd701SAndroid Build Coastguard Worker                 }
164*35ffd701SAndroid Build Coastguard Worker 
165*35ffd701SAndroid Build Coastguard Worker                 // Displayable surfaces cannot be Tiled4/64.
166*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(!GetGmmLibContext()->GetSkuTable().FtrDisplayYTiling);
167*35ffd701SAndroid Build Coastguard Worker 
168*35ffd701SAndroid Build Coastguard Worker                 //override displayable surfaces to TileX
169*35ffd701SAndroid Build Coastguard Worker                 if(GetGmmLibContext()->GetSkuTable().FtrDisplayXTiling)
170*35ffd701SAndroid Build Coastguard Worker                 {
171*35ffd701SAndroid Build Coastguard Worker                     if(CreateParams.Flags.Gpu.FlipChain || CreateParams.Flags.Gpu.Overlay ||
172*35ffd701SAndroid Build Coastguard Worker                        CreateParams.Flags.Gpu.Presentable)
173*35ffd701SAndroid Build Coastguard Worker                     {
174*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.TiledX = 1;
175*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.TiledY = 0;
176*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.Tile4  = 0;
177*35ffd701SAndroid Build Coastguard Worker                         CreateParams.Flags.Info.Tile64 = 0;
178*35ffd701SAndroid Build Coastguard Worker                     }
179*35ffd701SAndroid Build Coastguard Worker                 }
180*35ffd701SAndroid Build Coastguard Worker             }
181*35ffd701SAndroid Build Coastguard Worker         }
182*35ffd701SAndroid Build Coastguard Worker 
183*35ffd701SAndroid Build Coastguard Worker         //ExistingSysMem allocations must be Linear
184*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(!CreateParams.Flags.Info.ExistingSysMem ||
185*35ffd701SAndroid Build Coastguard Worker                      CreateParams.Flags.Info.Linear);
186*35ffd701SAndroid Build Coastguard Worker     }
187*35ffd701SAndroid Build Coastguard Worker 
188*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetSkuTable().FtrMultiTileArch)
189*35ffd701SAndroid Build Coastguard Worker     {
190*35ffd701SAndroid Build Coastguard Worker         // For Naive apps, UMD does not populate multi tile arch params.
191*35ffd701SAndroid Build Coastguard Worker         // Gmm will populate them based on the kmd assigned tile to the umd process
192*35ffd701SAndroid Build Coastguard Worker         if(!CreateParams.MultiTileArch.Enable)
193*35ffd701SAndroid Build Coastguard Worker         {
194*35ffd701SAndroid Build Coastguard Worker             uint32_t GpuTile = 0;
195*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(CreateParams.MultiTileArch.GpuVaMappingSet == 0);
196*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(CreateParams.MultiTileArch.LocalMemEligibilitySet == 0);
197*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(CreateParams.MultiTileArch.LocalMemPreferredSet == 0);
198*35ffd701SAndroid Build Coastguard Worker 
199*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(GetGmmLibContext()->GetSkuTable().FtrAssignedGpuTile < 4);
200*35ffd701SAndroid Build Coastguard Worker 
201*35ffd701SAndroid Build Coastguard Worker #if !__GMM_KMD__
202*35ffd701SAndroid Build Coastguard Worker             GpuTile                                    = GetGmmLibContext()->GetSkuTable().FtrAssignedGpuTile;
203*35ffd701SAndroid Build Coastguard Worker             CreateParams.MultiTileArch.GpuVaMappingSet = __BIT(GpuTile);
204*35ffd701SAndroid Build Coastguard Worker #else
205*35ffd701SAndroid Build Coastguard Worker             GpuTile                                    = 0;
206*35ffd701SAndroid Build Coastguard Worker             CreateParams.MultiTileArch.GpuVaMappingSet = GetGmmLibContext()->GetGtSysInfo()->MultiTileArchInfo.TileMask;
207*35ffd701SAndroid Build Coastguard Worker #endif
208*35ffd701SAndroid Build Coastguard Worker 
209*35ffd701SAndroid Build Coastguard Worker             CreateParams.MultiTileArch.Enable = true;
210*35ffd701SAndroid Build Coastguard Worker 
211*35ffd701SAndroid Build Coastguard Worker             if(!CreateParams.Flags.Info.NonLocalOnly)
212*35ffd701SAndroid Build Coastguard Worker             {
213*35ffd701SAndroid Build Coastguard Worker                 CreateParams.MultiTileArch.LocalMemEligibilitySet = __BIT(GpuTile);
214*35ffd701SAndroid Build Coastguard Worker                 CreateParams.MultiTileArch.LocalMemPreferredSet   = __BIT(GpuTile);
215*35ffd701SAndroid Build Coastguard Worker             }
216*35ffd701SAndroid Build Coastguard Worker         }
217*35ffd701SAndroid Build Coastguard Worker     }
218*35ffd701SAndroid Build Coastguard Worker 
219*35ffd701SAndroid Build Coastguard Worker     Surf.Type                      = CreateParams.Type;
220*35ffd701SAndroid Build Coastguard Worker     Surf.Format                    = CreateParams.Format;
221*35ffd701SAndroid Build Coastguard Worker     Surf.BaseWidth                 = CreateParams.BaseWidth64;
222*35ffd701SAndroid Build Coastguard Worker     Surf.BaseHeight                = CreateParams.BaseHeight;
223*35ffd701SAndroid Build Coastguard Worker     Surf.Depth                     = CreateParams.Depth;
224*35ffd701SAndroid Build Coastguard Worker     Surf.MaxLod                    = CreateParams.MaxLod;
225*35ffd701SAndroid Build Coastguard Worker     Surf.ArraySize                 = CreateParams.ArraySize;
226*35ffd701SAndroid Build Coastguard Worker     Surf.Flags                     = CreateParams.Flags;
227*35ffd701SAndroid Build Coastguard Worker     Surf.MSAA                      = CreateParams.MSAA;
228*35ffd701SAndroid Build Coastguard Worker     Surf.Alignment.BaseAlignment   = CreateParams.BaseAlignment;
229*35ffd701SAndroid Build Coastguard Worker     Surf.CachePolicy.Usage         = CreateParams.Usage;
230*35ffd701SAndroid Build Coastguard Worker     Surf.MSAA.NumSamples           = GFX_MAX(Surf.MSAA.NumSamples, 1);
231*35ffd701SAndroid Build Coastguard Worker     Surf.MaximumRenamingListLength = CreateParams.MaximumRenamingListLength;
232*35ffd701SAndroid Build Coastguard Worker     Surf.OverridePitch             = CreateParams.OverridePitch;
233*35ffd701SAndroid Build Coastguard Worker     Surf.CpTag                     = CreateParams.CpTag;
234*35ffd701SAndroid Build Coastguard Worker 
235*35ffd701SAndroid Build Coastguard Worker     Surf.Flags.Info.__PreWddm2SVM =
236*35ffd701SAndroid Build Coastguard Worker     Surf.Flags.Info.SVM &&
237*35ffd701SAndroid Build Coastguard Worker     !(GetGmmLibContext()->GetSkuTable().FtrWddm2GpuMmu ||
238*35ffd701SAndroid Build Coastguard Worker       GetGmmLibContext()->GetSkuTable().FtrWddm2Svm);
239*35ffd701SAndroid Build Coastguard Worker 
240*35ffd701SAndroid Build Coastguard Worker #if !__GMM_KMD__ && LHDM
241*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetWaTable().WaLLCCachingUnsupported)
242*35ffd701SAndroid Build Coastguard Worker     {
243*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Info.GttMapType = (CreateParams.Flags.Info.Cacheable) ?
244*35ffd701SAndroid Build Coastguard Worker                                      GMM_GTT_CACHETYPE_VLV_SNOOPED :
245*35ffd701SAndroid Build Coastguard Worker                                      GMM_GTT_CACHETYPE_UNCACHED;
246*35ffd701SAndroid Build Coastguard Worker     }
247*35ffd701SAndroid Build Coastguard Worker 
248*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetSkuTable().FtrCameraCaptureCaching == false &&
249*35ffd701SAndroid Build Coastguard Worker        CreateParams.Flags.Gpu.CameraCapture)
250*35ffd701SAndroid Build Coastguard Worker     {
251*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Info.Cacheable = 0;
252*35ffd701SAndroid Build Coastguard Worker     }
253*35ffd701SAndroid Build Coastguard Worker     Surf.Flags.Wa.ForceStdAllocAlign = 0;
254*35ffd701SAndroid Build Coastguard Worker #endif
255*35ffd701SAndroid Build Coastguard Worker 
256*35ffd701SAndroid Build Coastguard Worker #if(_DEBUG || _RELEASE_INTERNAL)
257*35ffd701SAndroid Build Coastguard Worker     Surf.Platform = GetGmmLibContext()->GetPlatformInfo().Platform;
258*35ffd701SAndroid Build Coastguard Worker #endif
259*35ffd701SAndroid Build Coastguard Worker 
260*35ffd701SAndroid Build Coastguard Worker     Surf.BitsPerPixel = BitsPerPixel;
261*35ffd701SAndroid Build Coastguard Worker 
262*35ffd701SAndroid Build Coastguard Worker     // Get pTextureCalc after surface evaluation
263*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
264*35ffd701SAndroid Build Coastguard Worker 
265*35ffd701SAndroid Build Coastguard Worker     GetGmmLibContext()->GetPlatformInfoObj()->SetCCSFlag(this->GetResFlags());
266*35ffd701SAndroid Build Coastguard Worker 
267*35ffd701SAndroid Build Coastguard Worker     // Moderate down displayable flags if input parameters are not conducive.
268*35ffd701SAndroid Build Coastguard Worker     // Reject non displayable tiling modes
269*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.FlipChain || Surf.Flags.Gpu.Overlay)
270*35ffd701SAndroid Build Coastguard Worker     {
271*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Info.TiledY && !GetGmmLibContext()->GetSkuTable().FtrDisplayYTiling)
272*35ffd701SAndroid Build Coastguard Worker         {
273*35ffd701SAndroid Build Coastguard Worker             if(Surf.Flags.Gpu.FlipChainPreferred)
274*35ffd701SAndroid Build Coastguard Worker             {
275*35ffd701SAndroid Build Coastguard Worker                 Surf.Flags.Gpu.Overlay   = 0;
276*35ffd701SAndroid Build Coastguard Worker                 Surf.Flags.Gpu.FlipChain = 0;
277*35ffd701SAndroid Build Coastguard Worker             }
278*35ffd701SAndroid Build Coastguard Worker             else
279*35ffd701SAndroid Build Coastguard Worker             {
280*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Y-Tiling mode not displayable");
281*35ffd701SAndroid Build Coastguard Worker                 //return false;
282*35ffd701SAndroid Build Coastguard Worker             }
283*35ffd701SAndroid Build Coastguard Worker         }
284*35ffd701SAndroid Build Coastguard Worker     }
285*35ffd701SAndroid Build Coastguard Worker 
286*35ffd701SAndroid Build Coastguard Worker     // Memory optimization for 64KB tiled Surface.
287*35ffd701SAndroid Build Coastguard Worker     if (!GetGmmLibContext()->GetSkuTable().FtrTileY)
288*35ffd701SAndroid Build Coastguard Worker     {
289*35ffd701SAndroid Build Coastguard Worker         if ((GetGmmLibContext()->GetSkuTable().FtrTile64Optimization) && Optimize64KBTile)
290*35ffd701SAndroid Build Coastguard Worker         {
291*35ffd701SAndroid Build Coastguard Worker             if ((GetGmmLibContext()->GetWaTable().Wa_14020040029) && (Surf.Flags.Gpu.Depth))
292*35ffd701SAndroid Build Coastguard Worker             {
293*35ffd701SAndroid Build Coastguard Worker                 // if SW uses Tile4 merely to reduce surface size for Depth buffers,
294*35ffd701SAndroid Build Coastguard Worker                 // then use Tile64 instead
295*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_64KB_TILE(Surf.Flags, 1, GetGmmLibContext());
296*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_4KB_TILE(Surf.Flags, 0, GetGmmLibContext());
297*35ffd701SAndroid Build Coastguard Worker 
298*35ffd701SAndroid Build Coastguard Worker                 //Also update CreateParams, if client reuses the modified struct, it'd see final tile-selection by Gmm.
299*35ffd701SAndroid Build Coastguard Worker                 //Gmm's auto-tile-selection & tile-mode for size-optimization doesn't work for explicit tile-selection
300*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_64KB_TILE(CreateParams.Flags, 1, GetGmmLibContext());
301*35ffd701SAndroid Build Coastguard Worker                 GMM_SET_4KB_TILE(CreateParams.Flags, 0, GetGmmLibContext());
302*35ffd701SAndroid Build Coastguard Worker             }
303*35ffd701SAndroid Build Coastguard Worker             else
304*35ffd701SAndroid Build Coastguard Worker             {
305*35ffd701SAndroid Build Coastguard Worker                 if (pTextureCalc->SurfaceRequires64KBTileOptimization(&Surf))
306*35ffd701SAndroid Build Coastguard Worker                 {
307*35ffd701SAndroid Build Coastguard Worker                     GMM_SET_64KB_TILE(Surf.Flags, 0, GetGmmLibContext());
308*35ffd701SAndroid Build Coastguard Worker                     GMM_SET_4KB_TILE(Surf.Flags, 1, GetGmmLibContext());
309*35ffd701SAndroid Build Coastguard Worker 
310*35ffd701SAndroid Build Coastguard Worker                     //Also update CreateParams, if client reuses the modified struct, it'd see final tile-selection by Gmm.
311*35ffd701SAndroid Build Coastguard Worker                     //Gmm's auto-tile-selection & tile-mode for size-optimization doesn't work for explicit tile-selection
312*35ffd701SAndroid Build Coastguard Worker                     GMM_SET_64KB_TILE(CreateParams.Flags, 0, GetGmmLibContext());
313*35ffd701SAndroid Build Coastguard Worker                     GMM_SET_4KB_TILE(CreateParams.Flags, 1, GetGmmLibContext());
314*35ffd701SAndroid Build Coastguard Worker                 }
315*35ffd701SAndroid Build Coastguard Worker             }
316*35ffd701SAndroid Build Coastguard Worker         }
317*35ffd701SAndroid Build Coastguard Worker     }
318*35ffd701SAndroid Build Coastguard Worker 
319*35ffd701SAndroid Build Coastguard Worker     // Convert Any Pseudo Creation Params to Actual...
320*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.UnifiedAuxSurface)
321*35ffd701SAndroid Build Coastguard Worker     {
322*35ffd701SAndroid Build Coastguard Worker         AuxSurf = Surf;
323*35ffd701SAndroid Build Coastguard Worker 
324*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Gpu.Depth && Surf.Flags.Gpu.CCS) //Depth + HiZ+CCS
325*35ffd701SAndroid Build Coastguard Worker         {
326*35ffd701SAndroid Build Coastguard Worker             //GMM_ASSERTDPF(Surf.Flags.Gpu.HiZ, "Lossless Z compression supported when Depth+HiZ+CCS is unified");
327*35ffd701SAndroid Build Coastguard Worker             AuxSecSurf                           = Surf;
328*35ffd701SAndroid Build Coastguard Worker             AuxSecSurf.Type                      = GetGmmLibContext()->GetSkuTable().FtrFlatPhysCCS ? RESOURCE_INVALID : AuxSecSurf.Type;
329*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.HiZ                   = 0; //Its depth buffer, so clear HiZ
330*35ffd701SAndroid Build Coastguard Worker             AuxSecSurf.Flags.Gpu.HiZ             = 0;
331*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Gpu.IndirectClearColor = 0; //Clear Depth flags from HiZ, contained with separate/legacy HiZ when Depth isn't compressible.
332*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Gpu.CCS                = 0;
333*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Type                         = (AuxSurf.Flags.Gpu.HiZ) ? AuxSurf.Type : RESOURCE_INVALID;
334*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Info.RenderCompressed = AuxSurf.Flags.Info.MediaCompressed = 0;
335*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Info.NotCompressed                                         = 1;
336*35ffd701SAndroid Build Coastguard Worker         }
337*35ffd701SAndroid Build Coastguard Worker         else if(Surf.Flags.Gpu.Depth && Surf.Flags.Gpu.HiZ && !Surf.Flags.Gpu.CCS) // Depth + HiZ only, CCS is disabled
338*35ffd701SAndroid Build Coastguard Worker         {
339*35ffd701SAndroid Build Coastguard Worker             // main surface is depth, AuxSurf is HiZ
340*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.HiZ                   = 0; //depth buffer, clear HiZ
341*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Gpu.IndirectClearColor = 0; //Clear fastClear from HiZ
342*35ffd701SAndroid Build Coastguard Worker         }
343*35ffd701SAndroid Build Coastguard Worker 	else if(Surf.Flags.Gpu.SeparateStencil && Surf.Flags.Gpu.CCS) //Stencil compression
344*35ffd701SAndroid Build Coastguard Worker         {
345*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Gpu.SeparateStencil = 0;
346*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.CCS                = 0;
347*35ffd701SAndroid Build Coastguard Worker             if(GMM_SUCCESS != pTextureCalc->PreProcessTexSpecialCases(&Surf))
348*35ffd701SAndroid Build Coastguard Worker             {
349*35ffd701SAndroid Build Coastguard Worker                 return false;
350*35ffd701SAndroid Build Coastguard Worker             }
351*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.CCS = 1;
352*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Type       = GetGmmLibContext()->GetSkuTable().FtrFlatPhysCCS ? RESOURCE_INVALID : AuxSurf.Type;
353*35ffd701SAndroid Build Coastguard Worker         }
354*35ffd701SAndroid Build Coastguard Worker         else if(Surf.MSAA.NumSamples > 1 && Surf.Flags.Gpu.CCS) //MSAA+MCS+CCS
355*35ffd701SAndroid Build Coastguard Worker         {
356*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(Surf.Flags.Gpu.MCS, "Lossless MSAA supported when MSAA+MCS+CCS is unified");
357*35ffd701SAndroid Build Coastguard Worker             AuxSecSurf                          = Surf;
358*35ffd701SAndroid Build Coastguard Worker             AuxSecSurf.Type                     = GetGmmLibContext()->GetSkuTable().FtrFlatPhysCCS ? RESOURCE_INVALID : AuxSecSurf.Type;
359*35ffd701SAndroid Build Coastguard Worker             AuxSecSurf.Flags.Gpu.MCS            = 0;
360*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Gpu.CCS               = 0;
361*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Info.RenderCompressed = AuxSurf.Flags.Info.MediaCompressed = 0;
362*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Info.NotCompressed                                         = 1;
363*35ffd701SAndroid Build Coastguard Worker         }
364*35ffd701SAndroid Build Coastguard Worker         else if(Surf.Flags.Gpu.CCS)
365*35ffd701SAndroid Build Coastguard Worker         {
366*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Type = (GetGmmLibContext()->GetSkuTable().FtrFlatPhysCCS && !Surf.Flags.Gpu.ProceduralTexture) ? RESOURCE_INVALID : AuxSurf.Type;
367*35ffd701SAndroid Build Coastguard Worker         }
368*35ffd701SAndroid Build Coastguard Worker 
369*35ffd701SAndroid Build Coastguard Worker         if(AuxSurf.Type != RESOURCE_INVALID &&
370*35ffd701SAndroid Build Coastguard Worker            GMM_SUCCESS != pTextureCalc->PreProcessTexSpecialCases(&AuxSurf))
371*35ffd701SAndroid Build Coastguard Worker         {
372*35ffd701SAndroid Build Coastguard Worker             return false;
373*35ffd701SAndroid Build Coastguard Worker         }
374*35ffd701SAndroid Build Coastguard Worker         if(AuxSecSurf.Type != RESOURCE_INVALID &&
375*35ffd701SAndroid Build Coastguard Worker            GMM_SUCCESS != pTextureCalc->PreProcessTexSpecialCases(&AuxSecSurf))
376*35ffd701SAndroid Build Coastguard Worker         {
377*35ffd701SAndroid Build Coastguard Worker             return false;
378*35ffd701SAndroid Build Coastguard Worker         }
379*35ffd701SAndroid Build Coastguard Worker     }
380*35ffd701SAndroid Build Coastguard Worker     else
381*35ffd701SAndroid Build Coastguard Worker     {
382*35ffd701SAndroid Build Coastguard Worker         if(GMM_SUCCESS != pTextureCalc->PreProcessTexSpecialCases(&Surf))
383*35ffd701SAndroid Build Coastguard Worker         {
384*35ffd701SAndroid Build Coastguard Worker             return false;
385*35ffd701SAndroid Build Coastguard Worker         }
386*35ffd701SAndroid Build Coastguard Worker     }
387*35ffd701SAndroid Build Coastguard Worker 
388*35ffd701SAndroid Build Coastguard Worker     RotateInfo = CreateParams.RotateInfo;
389*35ffd701SAndroid Build Coastguard Worker 
390*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetSkuTable().FtrMultiTileArch)
391*35ffd701SAndroid Build Coastguard Worker     {
392*35ffd701SAndroid Build Coastguard Worker         MultiTileArch = CreateParams.MultiTileArch;
393*35ffd701SAndroid Build Coastguard Worker     }
394*35ffd701SAndroid Build Coastguard Worker 
395*35ffd701SAndroid Build Coastguard Worker     // For Xe2 RenderCompressed and MediaCompressed to be unset
396*35ffd701SAndroid Build Coastguard Worker     if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
397*35ffd701SAndroid Build Coastguard Worker     {
398*35ffd701SAndroid Build Coastguard Worker         //Deny compression
399*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Info.RenderCompressed = 0;
400*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Info.MediaCompressed  = 0;
401*35ffd701SAndroid Build Coastguard Worker     }
402*35ffd701SAndroid Build Coastguard Worker     return true;
403*35ffd701SAndroid Build Coastguard Worker }
404*35ffd701SAndroid Build Coastguard Worker 
405*35ffd701SAndroid Build Coastguard Worker 
406*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
407*35ffd701SAndroid Build Coastguard Worker /// Validates the parameters passed in by clients to make sure they do not
408*35ffd701SAndroid Build Coastguard Worker /// conflict or ask for unsupporting combinations/features.
409*35ffd701SAndroid Build Coastguard Worker ///
410*35ffd701SAndroid Build Coastguard Worker /// @return     1 is validation passed. 0 otherwise.
411*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
ValidateParams()412*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::ValidateParams()
413*35ffd701SAndroid Build Coastguard Worker {
414*35ffd701SAndroid Build Coastguard Worker     __GMM_BUFFER_TYPE              Restrictions             = {0};
415*35ffd701SAndroid Build Coastguard Worker     const __GMM_PLATFORM_RESOURCE *pPlatformResource        = NULL;
416*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *             pTextureCalc             = NULL;
417*35ffd701SAndroid Build Coastguard Worker     bool                           AllowMaxWidthViolations  = false;
418*35ffd701SAndroid Build Coastguard Worker     bool                           AllowMaxHeightViolations = false;
419*35ffd701SAndroid Build Coastguard Worker     uint8_t                        Status                   = 0;
420*35ffd701SAndroid Build Coastguard Worker 
421*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
422*35ffd701SAndroid Build Coastguard Worker 
423*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(GetGmmLibContext(), 0);
424*35ffd701SAndroid Build Coastguard Worker 
425*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__) && (_DEBUG || _RELEASE_INTERNAL))
426*35ffd701SAndroid Build Coastguard Worker     //KMD Debug and Release Internal Drivers only
427*35ffd701SAndroid Build Coastguard Worker     //if GMM_TEXTURE_INFO's platform type != native platform
428*35ffd701SAndroid Build Coastguard Worker     //then initialize the OverridePlatformInfo.
429*35ffd701SAndroid Build Coastguard Worker 
430*35ffd701SAndroid Build Coastguard Worker     //If GMM_TEXTURE_INFO's platform type == IGFX_UNKNOWN_CORE then it means that UMD driver is
431*35ffd701SAndroid Build Coastguard Worker     //in "Release" version and passes all zeros in Surf.Platform
432*35ffd701SAndroid Build Coastguard Worker     if(GFX_GET_CURRENT_RENDERCORE(Surf.Platform) == IGFX_UNKNOWN_CORE)
433*35ffd701SAndroid Build Coastguard Worker     {
434*35ffd701SAndroid Build Coastguard Worker         Surf.Platform = GetGmmLibContext()->GetPlatformInfo().Platform;
435*35ffd701SAndroid Build Coastguard Worker         // If this is a unified surface then make sure the AUX surface has the same platform info
436*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Gpu.UnifiedAuxSurface)
437*35ffd701SAndroid Build Coastguard Worker         {
438*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Platform    = Surf.Platform;
439*35ffd701SAndroid Build Coastguard Worker             AuxSecSurf.Platform = Surf.Platform;
440*35ffd701SAndroid Build Coastguard Worker         }
441*35ffd701SAndroid Build Coastguard Worker     }
442*35ffd701SAndroid Build Coastguard Worker 
443*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetPlatformInfoObj() != NULL &&
444*35ffd701SAndroid Build Coastguard Worker        (GFX_GET_CURRENT_RENDERCORE(Surf.Platform) !=
445*35ffd701SAndroid Build Coastguard Worker         GFX_GET_CURRENT_RENDERCORE(GetGmmLibContext()->GetPlatformInfo().Platform)) &&
446*35ffd701SAndroid Build Coastguard Worker        (GetGmmLibContext()->GetOverridePlatformInfoObj() == NULL ||
447*35ffd701SAndroid Build Coastguard Worker         (GFX_GET_CURRENT_RENDERCORE(Surf.Platform) !=
448*35ffd701SAndroid Build Coastguard Worker          GFX_GET_CURRENT_RENDERCORE(GetGmmLibContext()->GetOverridePlatformInfo().Platform))))
449*35ffd701SAndroid Build Coastguard Worker     {
450*35ffd701SAndroid Build Coastguard Worker         //Ensure override is a future platform.
451*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(GFX_GET_CURRENT_RENDERCORE(Surf.Platform) >
452*35ffd701SAndroid Build Coastguard Worker                      GFX_GET_CURRENT_RENDERCORE(GetGmmLibContext()->GetPlatformInfo().Platform));
453*35ffd701SAndroid Build Coastguard Worker 
454*35ffd701SAndroid Build Coastguard Worker         GetGmmLibContext()->SetOverridePlatformInfoObj(GetGmmLibContext()->CreatePlatformInfo(Surf.Platform, true));
455*35ffd701SAndroid Build Coastguard Worker 
456*35ffd701SAndroid Build Coastguard Worker         if(GetGmmLibContext()->GetOverrideTextureCalc())
457*35ffd701SAndroid Build Coastguard Worker         {
458*35ffd701SAndroid Build Coastguard Worker             delete(GetGmmLibContext()->GetOverrideTextureCalc());
459*35ffd701SAndroid Build Coastguard Worker             GetGmmLibContext()->SetOverrideTextureCalc(NULL);
460*35ffd701SAndroid Build Coastguard Worker         }
461*35ffd701SAndroid Build Coastguard Worker 
462*35ffd701SAndroid Build Coastguard Worker 	GetGmmLibContext()->SetOverrideTextureCalc(GetGmmLibContext()->CreateTextureCalc(Surf.Platform, true));
463*35ffd701SAndroid Build Coastguard Worker 
464*35ffd701SAndroid Build Coastguard Worker     }
465*35ffd701SAndroid Build Coastguard Worker #endif
466*35ffd701SAndroid Build Coastguard Worker 
467*35ffd701SAndroid Build Coastguard Worker     pPlatformResource = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
468*35ffd701SAndroid Build Coastguard Worker     pTextureCalc      = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
469*35ffd701SAndroid Build Coastguard Worker 
470*35ffd701SAndroid Build Coastguard Worker     if (!pTextureCalc)
471*35ffd701SAndroid Build Coastguard Worker     {
472*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Texture Calculation pointer is NULL.");
473*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
474*35ffd701SAndroid Build Coastguard Worker     }
475*35ffd701SAndroid Build Coastguard Worker 
476*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(!(
477*35ffd701SAndroid Build Coastguard Worker     Surf.Flags.Gpu.Query &&
478*35ffd701SAndroid Build Coastguard Worker     !Surf.Flags.Info.Cacheable)); // Why query not set as cacheable? If not cacheable, what keeps from stolen memory (because STORE_DWORD/PIPE_CONTROL/etc. targets can't be in stolen)?
479*35ffd701SAndroid Build Coastguard Worker 
480*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.HiZ)
481*35ffd701SAndroid Build Coastguard Worker     {
482*35ffd701SAndroid Build Coastguard Worker         // HiZ checked in PreProcessTexSpecialCases before legal HZ_Width/Height expansion.
483*35ffd701SAndroid Build Coastguard Worker         AllowMaxWidthViolations  = true;
484*35ffd701SAndroid Build Coastguard Worker         AllowMaxHeightViolations = true;
485*35ffd701SAndroid Build Coastguard Worker     }
486*35ffd701SAndroid Build Coastguard Worker 
487*35ffd701SAndroid Build Coastguard Worker     // check bpp
488*35ffd701SAndroid Build Coastguard Worker     if(((Surf.BitsPerPixel < 8) || (Surf.BitsPerPixel % GMM_BITS(8))) &&
489*35ffd701SAndroid Build Coastguard Worker        !(Surf.BitsPerPixel == 1))
490*35ffd701SAndroid Build Coastguard Worker     {
491*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid BitsPerPixel!");
492*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
493*35ffd701SAndroid Build Coastguard Worker     }
494*35ffd701SAndroid Build Coastguard Worker 
495*35ffd701SAndroid Build Coastguard Worker     // Check at least one tile pref set.
496*35ffd701SAndroid Build Coastguard Worker     // Yf/Ys checked explicitly here, require one of Y or Linear depending on resource type (e.g 1D-->Linear)
497*35ffd701SAndroid Build Coastguard Worker     // that TODO: could be automatically promoted.
498*35ffd701SAndroid Build Coastguard Worker     if((Surf.Flags.Info.Linear == 0) &&
499*35ffd701SAndroid Build Coastguard Worker        (Surf.Flags.Info.TiledX == 0) &&
500*35ffd701SAndroid Build Coastguard Worker        (Surf.Flags.Info.TiledW == 0) &&
501*35ffd701SAndroid Build Coastguard Worker        (Surf.Flags.Info.TiledYf == 0) &&
502*35ffd701SAndroid Build Coastguard Worker        !GMM_IS_4KB_TILE(Surf.Flags) && !GMM_IS_64KB_TILE(Surf.Flags))
503*35ffd701SAndroid Build Coastguard Worker     {
504*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "No Tile or Linear preference specified!");
505*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
506*35ffd701SAndroid Build Coastguard Worker     }
507*35ffd701SAndroid Build Coastguard Worker 
508*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Info.Tile64 || Surf.Flags.Info.TiledYf || Surf.Flags.Info.TiledYs)
509*35ffd701SAndroid Build Coastguard Worker     {
510*35ffd701SAndroid Build Coastguard Worker         if(!GMM_IS_SUPPORTED_BPP_ON_TILE_64_YF_YS(Surf.BitsPerPixel))
511*35ffd701SAndroid Build Coastguard Worker         {
512*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "BPP not supported on selected Tile format!");
513*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
514*35ffd701SAndroid Build Coastguard Worker         }
515*35ffd701SAndroid Build Coastguard Worker     }
516*35ffd701SAndroid Build Coastguard Worker 
517*35ffd701SAndroid Build Coastguard Worker     if(!__CanSupportStdTiling(Surf, GetGmmLibContext()))
518*35ffd701SAndroid Build Coastguard Worker     {
519*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid TileYf/TileYs usage!");
520*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
521*35ffd701SAndroid Build Coastguard Worker     }
522*35ffd701SAndroid Build Coastguard Worker 
523*35ffd701SAndroid Build Coastguard Worker     if(Surf.TileMode < TILE_NONE || Surf.TileMode >= GMM_TILE_MODES)
524*35ffd701SAndroid Build Coastguard Worker     {
525*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid TileMode usage!");
526*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
527*35ffd701SAndroid Build Coastguard Worker     }
528*35ffd701SAndroid Build Coastguard Worker 
529*35ffd701SAndroid Build Coastguard Worker     if(!((Surf.Format > GMM_FORMAT_INVALID) &&
530*35ffd701SAndroid Build Coastguard Worker          (Surf.Format < GMM_RESOURCE_FORMATS)))
531*35ffd701SAndroid Build Coastguard Worker     {
532*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid Resource Format!");
533*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
534*35ffd701SAndroid Build Coastguard Worker     }
535*35ffd701SAndroid Build Coastguard Worker 
536*35ffd701SAndroid Build Coastguard Worker     // Check resource format is supported on running platform
537*35ffd701SAndroid Build Coastguard Worker     if(IsPresentableformat() == false)
538*35ffd701SAndroid Build Coastguard Worker     {
539*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Bad Format!");
540*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
541*35ffd701SAndroid Build Coastguard Worker     }
542*35ffd701SAndroid Build Coastguard Worker 
543*35ffd701SAndroid Build Coastguard Worker     if((Surf.Type == RESOURCE_PRIMARY) &&
544*35ffd701SAndroid Build Coastguard Worker        !Surf.Flags.Gpu.FlipChain)
545*35ffd701SAndroid Build Coastguard Worker     {
546*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Primary does not have FlipChain flag set.");
547*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
548*35ffd701SAndroid Build Coastguard Worker     }
549*35ffd701SAndroid Build Coastguard Worker 
550*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.Overlay &&
551*35ffd701SAndroid Build Coastguard Worker        Surf.Flags.Gpu.FlipChain)
552*35ffd701SAndroid Build Coastguard Worker     {
553*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Overlay and FlipChain flags set. S3D logic may fail.");
554*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
555*35ffd701SAndroid Build Coastguard Worker     }
556*35ffd701SAndroid Build Coastguard Worker 
557*35ffd701SAndroid Build Coastguard Worker     // Displayable surfaces must remain Tile4
558*35ffd701SAndroid Build Coastguard Worker     if(((!GetGmmLibContext()->GetSkuTable().FtrDisplayDisabled) &&
559*35ffd701SAndroid Build Coastguard Worker         (Surf.Flags.Gpu.Overlay || Surf.Flags.Gpu.FlipChain)) &&
560*35ffd701SAndroid Build Coastguard Worker        (!(Surf.Flags.Info.Linear || Surf.Flags.Info.TiledX || GMM_IS_4KB_TILE(Surf.Flags))))
561*35ffd701SAndroid Build Coastguard Worker     {
562*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Unsupported tiling format for displayable resource.");
563*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
564*35ffd701SAndroid Build Coastguard Worker     }
565*35ffd701SAndroid Build Coastguard Worker 
566*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetSkuTable().FtrLocalMemory)
567*35ffd701SAndroid Build Coastguard Worker     {
568*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(((Surf.Flags.Info.NonLocalOnly && Surf.Flags.Info.LocalOnly) == 0),
569*35ffd701SAndroid Build Coastguard Worker                       "Incorrect segment preference, cannot be both local and system memory.");
570*35ffd701SAndroid Build Coastguard Worker 
571*35ffd701SAndroid Build Coastguard Worker 	// Before overriding the flags predetermine if compression request is deniable or not.
572*35ffd701SAndroid Build Coastguard Worker         if(!Surf.Flags.Info.LocalOnly &&
573*35ffd701SAndroid Build Coastguard Worker            (!(Surf.Flags.Gpu.Overlay || Surf.Flags.Gpu.FlipChain)) &&
574*35ffd701SAndroid Build Coastguard Worker            !(Surf.Flags.Info.HardwareProtected))
575*35ffd701SAndroid Build Coastguard Worker         {
576*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Wa.DeniableLocalOnlyForCompression = 1;
577*35ffd701SAndroid Build Coastguard Worker         }
578*35ffd701SAndroid Build Coastguard Worker 
579*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Gpu.Overlay ||
580*35ffd701SAndroid Build Coastguard Worker            Surf.Flags.Gpu.FlipChain)
581*35ffd701SAndroid Build Coastguard Worker         {
582*35ffd701SAndroid Build Coastguard Worker             if(Surf.Flags.Info.NonLocalOnly)
583*35ffd701SAndroid Build Coastguard Worker             {
584*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Overlay and FlipChain cannot be in system memory.");
585*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
586*35ffd701SAndroid Build Coastguard Worker             }
587*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.LocalOnly    = 1;
588*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.NonLocalOnly = 0;
589*35ffd701SAndroid Build Coastguard Worker         }
590*35ffd701SAndroid Build Coastguard Worker         if(GetGmmLibContext()->GetSkuTable().FtrFlatPhysCCS &&
591*35ffd701SAndroid Build Coastguard Worker             !GetGmmLibContext()->GetSkuTable().FtrXe2Compression &&
592*35ffd701SAndroid Build Coastguard Worker            (Surf.Flags.Info.RenderCompressed ||
593*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.MediaCompressed))
594*35ffd701SAndroid Build Coastguard Worker         {
595*35ffd701SAndroid Build Coastguard Worker             if(Surf.Flags.Info.NonLocalOnly)
596*35ffd701SAndroid Build Coastguard Worker             {
597*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Compressible surfaces cannot be in system memory.");
598*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
599*35ffd701SAndroid Build Coastguard Worker             }
600*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.LocalOnly    = 1;
601*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.NonLocalOnly = 0;
602*35ffd701SAndroid Build Coastguard Worker         }
603*35ffd701SAndroid Build Coastguard Worker 
604*35ffd701SAndroid Build Coastguard Worker         if(!Surf.Flags.Info.NotLockable &&
605*35ffd701SAndroid Build Coastguard Worker            Surf.Flags.Info.Shared)
606*35ffd701SAndroid Build Coastguard Worker         {
607*35ffd701SAndroid Build Coastguard Worker             if(Surf.Flags.Info.LocalOnly)
608*35ffd701SAndroid Build Coastguard Worker             {
609*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Lockable Shared cannot be in local memory.");
610*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
611*35ffd701SAndroid Build Coastguard Worker             }
612*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.LocalOnly    = 0;
613*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.NonLocalOnly = 1;
614*35ffd701SAndroid Build Coastguard Worker         }
615*35ffd701SAndroid Build Coastguard Worker 
616*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Gpu.CameraCapture)
617*35ffd701SAndroid Build Coastguard Worker         {
618*35ffd701SAndroid Build Coastguard Worker             if(Surf.Flags.Info.LocalOnly)
619*35ffd701SAndroid Build Coastguard Worker             {
620*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "CameraCapture cannot be in local memory.");
621*35ffd701SAndroid Build Coastguard Worker             }
622*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.LocalOnly    = 0;
623*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.NonLocalOnly = 1;
624*35ffd701SAndroid Build Coastguard Worker         }
625*35ffd701SAndroid Build Coastguard Worker 
626*35ffd701SAndroid Build Coastguard Worker         if(GetGmmLibContext()->GetWaTable().Wa64kbMappingAt2mbGranularity &&
627*35ffd701SAndroid Build Coastguard Worker            (!GetGmmLibContext()->GetSkuTable().FtrLocalMemoryAllows4KB) &&
628*35ffd701SAndroid Build Coastguard Worker            !Surf.Flags.Info.NonLocalOnly)
629*35ffd701SAndroid Build Coastguard Worker         {
630*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.LocalOnly = true;
631*35ffd701SAndroid Build Coastguard Worker 
632*35ffd701SAndroid Build Coastguard Worker         }
633*35ffd701SAndroid Build Coastguard Worker     }
634*35ffd701SAndroid Build Coastguard Worker     else
635*35ffd701SAndroid Build Coastguard Worker     {
636*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Info.LocalOnly = false; //Zero out on iGPU
637*35ffd701SAndroid Build Coastguard Worker         if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression && Surf.Flags.Info.XAdapter)
638*35ffd701SAndroid Build Coastguard Worker         {
639*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.NotCompressed     = 1; // disable compression for XAdapter resources on iGPU,
640*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.CCS                = 0;
641*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.UnifiedAuxSurface  = 0;
642*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.IndirectClearColor = 0;
643*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Gpu.MCS                = 0;
644*35ffd701SAndroid Build Coastguard Worker         }
645*35ffd701SAndroid Build Coastguard Worker     }
646*35ffd701SAndroid Build Coastguard Worker     if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
647*35ffd701SAndroid Build Coastguard Worker     {
648*35ffd701SAndroid Build Coastguard Worker         if (Surf.Flags.Info.TiledX)
649*35ffd701SAndroid Build Coastguard Worker         {
650*35ffd701SAndroid Build Coastguard Worker             if (!(Surf.Flags.Gpu.FlipChain || Surf.Flags.Gpu.Overlay))
651*35ffd701SAndroid Build Coastguard Worker             {
652*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "TiledX request for non displayable");
653*35ffd701SAndroid Build Coastguard Worker             }
654*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.NotCompressed = 1; // disable compression for TileX resources
655*35ffd701SAndroid Build Coastguard Worker         }
656*35ffd701SAndroid Build Coastguard Worker 
657*35ffd701SAndroid Build Coastguard Worker         if ((Surf.Flags.Gpu.FlipChain || Surf.Flags.Gpu.Overlay) && !Surf.Flags.Info.Tile4)
658*35ffd701SAndroid Build Coastguard Worker         {
659*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.NotCompressed = 1; //Disable compression if displayable are not tile4
660*35ffd701SAndroid Build Coastguard Worker         }
661*35ffd701SAndroid Build Coastguard Worker     }
662*35ffd701SAndroid Build Coastguard Worker 
663*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) < IGFX_GEN8_CORE) &&
664*35ffd701SAndroid Build Coastguard Worker        Surf.Flags.Info.TiledW)
665*35ffd701SAndroid Build Coastguard Worker     {
666*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Flag not supported on this platform.");
667*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
668*35ffd701SAndroid Build Coastguard Worker     }
669*35ffd701SAndroid Build Coastguard Worker 
670*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) > IGFX_GEN11_CORE) &&
671*35ffd701SAndroid Build Coastguard Worker        Surf.Flags.Info.TiledW)
672*35ffd701SAndroid Build Coastguard Worker     {
673*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Flag not supported on this platform.");
674*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
675*35ffd701SAndroid Build Coastguard Worker     }
676*35ffd701SAndroid Build Coastguard Worker 
677*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) < IGFX_GEN9_CORE) &&
678*35ffd701SAndroid Build Coastguard Worker #if(_DEBUG || _RELEASE_INTERNAL)
679*35ffd701SAndroid Build Coastguard Worker        !GetGmmLibContext()->GetWaTable().WaDisregardPlatformChecks &&
680*35ffd701SAndroid Build Coastguard Worker #endif
681*35ffd701SAndroid Build Coastguard Worker        Surf.Flags.Gpu.MMC)
682*35ffd701SAndroid Build Coastguard Worker     {
683*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Flag not supported on this platform.");
684*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
685*35ffd701SAndroid Build Coastguard Worker     }
686*35ffd701SAndroid Build Coastguard Worker 
687*35ffd701SAndroid Build Coastguard Worker     //For Media Memory Compression --
688*35ffd701SAndroid Build Coastguard Worker     if((Status = GetGmmLibContext()->GetPlatformInfoObj()->ValidateMMC(Surf)) == 0)
689*35ffd701SAndroid Build Coastguard Worker     {
690*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid flag or array size!");
691*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
692*35ffd701SAndroid Build Coastguard Worker     }
693*35ffd701SAndroid Build Coastguard Worker 
694*35ffd701SAndroid Build Coastguard Worker     if(!GetGmmLibContext()->GetSkuTable().FtrTileY)
695*35ffd701SAndroid Build Coastguard Worker     {
696*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Gpu.TiledResource &&
697*35ffd701SAndroid Build Coastguard Worker            ((Surf.Flags.Info.Linear && !(Surf.Type == RESOURCE_BUFFER)) || Surf.Flags.Info.TiledYs ||
698*35ffd701SAndroid Build Coastguard Worker             Surf.Flags.Info.TiledYf || Surf.Flags.Info.TiledY))
699*35ffd701SAndroid Build Coastguard Worker         {
700*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Invalid Tile for TiledResource!");
701*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
702*35ffd701SAndroid Build Coastguard Worker         }
703*35ffd701SAndroid Build Coastguard Worker         if(GMM_IS_64KB_TILE(Surf.Flags) &&
704*35ffd701SAndroid Build Coastguard Worker            (Surf.MSAA.NumSamples > 1) &&
705*35ffd701SAndroid Build Coastguard Worker            (Surf.MaxLod != 0))
706*35ffd701SAndroid Build Coastguard Worker         {
707*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Mipped MSAA not supported for Tile64!");
708*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
709*35ffd701SAndroid Build Coastguard Worker         }
710*35ffd701SAndroid Build Coastguard Worker         // Tile4 does not support MSAA.
711*35ffd701SAndroid Build Coastguard Worker         if(GMM_IS_4KB_TILE(Surf.Flags) &&
712*35ffd701SAndroid Build Coastguard Worker            (Surf.MSAA.NumSamples > 1))
713*35ffd701SAndroid Build Coastguard Worker         {
714*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "No MSAA support for Tile4!");
715*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
716*35ffd701SAndroid Build Coastguard Worker         }
717*35ffd701SAndroid Build Coastguard Worker     }
718*35ffd701SAndroid Build Coastguard Worker 
719*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(!(GetGmmLibContext()->GetSkuTable().FtrTileY &&
720*35ffd701SAndroid Build Coastguard Worker                    (Surf.Flags.Info.Tile4 || Surf.Flags.Info.Tile64)));
721*35ffd701SAndroid Build Coastguard Worker 
722*35ffd701SAndroid Build Coastguard Worker     //GMM asserts that ExistingSysMem allocation (whose malloc is outside GmmLib) are either
723*35ffd701SAndroid Build Coastguard Worker     //SVM Buffer, Index Buffer, Vertex Buffers, Render Target, Texture
724*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Info.ExistingSysMem &&
725*35ffd701SAndroid Build Coastguard Worker        !Surf.ExistingSysMem.IsGmmAllocated &&
726*35ffd701SAndroid Build Coastguard Worker        !Surf.ExistingSysMem.IsPageAligned)
727*35ffd701SAndroid Build Coastguard Worker     {
728*35ffd701SAndroid Build Coastguard Worker         if(!(Surf.Flags.Gpu.RenderTarget ||
729*35ffd701SAndroid Build Coastguard Worker              Surf.Flags.Gpu.Vertex ||
730*35ffd701SAndroid Build Coastguard Worker              Surf.Flags.Gpu.Index ||
731*35ffd701SAndroid Build Coastguard Worker              Surf.Flags.Gpu.Texture ||
732*35ffd701SAndroid Build Coastguard Worker              Surf.Flags.Info.Linear ||
733*35ffd701SAndroid Build Coastguard Worker              Surf.Flags.Info.SVM))
734*35ffd701SAndroid Build Coastguard Worker         {
735*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Flag not supported by ExistingSysMem alloc!");
736*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
737*35ffd701SAndroid Build Coastguard Worker         }
738*35ffd701SAndroid Build Coastguard Worker 
739*35ffd701SAndroid Build Coastguard Worker         if(Surf.Type == RESOURCE_3D ||
740*35ffd701SAndroid Build Coastguard Worker            Surf.Type == RESOURCE_CUBE ||
741*35ffd701SAndroid Build Coastguard Worker            Surf.MaxLod ||
742*35ffd701SAndroid Build Coastguard Worker            GmmIsYUVPlanar(Surf.Format))
743*35ffd701SAndroid Build Coastguard Worker         {
744*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Invalid ExistingSysMem resource Type/Format");
745*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
746*35ffd701SAndroid Build Coastguard Worker         }
747*35ffd701SAndroid Build Coastguard Worker     }
748*35ffd701SAndroid Build Coastguard Worker 
749*35ffd701SAndroid Build Coastguard Worker     pTextureCalc->GetResRestrictions(&Surf, Restrictions);
750*35ffd701SAndroid Build Coastguard Worker 
751*35ffd701SAndroid Build Coastguard Worker     // Check array size to make sure it meets HW limits
752*35ffd701SAndroid Build Coastguard Worker     if((Surf.ArraySize > Restrictions.MaxArraySize) &&
753*35ffd701SAndroid Build Coastguard Worker        ((RESOURCE_1D == Surf.Type) ||
754*35ffd701SAndroid Build Coastguard Worker         (RESOURCE_2D == Surf.Type) ||
755*35ffd701SAndroid Build Coastguard Worker         (RESOURCE_CUBE == Surf.Type)))
756*35ffd701SAndroid Build Coastguard Worker     {
757*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid array size!");
758*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
759*35ffd701SAndroid Build Coastguard Worker     }
760*35ffd701SAndroid Build Coastguard Worker 
761*35ffd701SAndroid Build Coastguard Worker     // Check dimensions to make sure it meets HW max limits
762*35ffd701SAndroid Build Coastguard Worker     if(((Surf.BaseHeight > Restrictions.MaxHeight) && !AllowMaxHeightViolations) ||
763*35ffd701SAndroid Build Coastguard Worker        ((Surf.BaseWidth > Restrictions.MaxWidth) && !AllowMaxWidthViolations) ||
764*35ffd701SAndroid Build Coastguard Worker        (Surf.Depth > Restrictions.MaxDepth)) // Any reason why MaxDepth != 1 for Tex2D
765*35ffd701SAndroid Build Coastguard Worker     {
766*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid Dimension. Greater than max!");
767*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
768*35ffd701SAndroid Build Coastguard Worker     }
769*35ffd701SAndroid Build Coastguard Worker 
770*35ffd701SAndroid Build Coastguard Worker     // Check width to make sure it meets Yx requirements
771*35ffd701SAndroid Build Coastguard Worker     if(((Surf.Format == GMM_FORMAT_Y8_UNORM_VA) && (Surf.BaseWidth % 4)) ||
772*35ffd701SAndroid Build Coastguard Worker        ((Surf.Format == GMM_FORMAT_Y16_UNORM) && (Surf.BaseWidth % 2)) ||
773*35ffd701SAndroid Build Coastguard Worker        ((Surf.Format == GMM_FORMAT_Y1_UNORM) && (Surf.BaseWidth % 32)))
774*35ffd701SAndroid Build Coastguard Worker     {
775*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid width!");
776*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
777*35ffd701SAndroid Build Coastguard Worker     }
778*35ffd701SAndroid Build Coastguard Worker 
779*35ffd701SAndroid Build Coastguard Worker     // Check dimensions to make sure it meets HW min limits
780*35ffd701SAndroid Build Coastguard Worker     if((Surf.BaseHeight < Restrictions.MinHeight) ||
781*35ffd701SAndroid Build Coastguard Worker        (Surf.BaseWidth < Restrictions.MinWidth) ||
782*35ffd701SAndroid Build Coastguard Worker        (Surf.Depth < Restrictions.MinDepth))
783*35ffd701SAndroid Build Coastguard Worker     {
784*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid Dimension. Less than min!");
785*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
786*35ffd701SAndroid Build Coastguard Worker     }
787*35ffd701SAndroid Build Coastguard Worker 
788*35ffd701SAndroid Build Coastguard Worker     // check mip map
789*35ffd701SAndroid Build Coastguard Worker     if(Surf.MaxLod > pPlatformResource->MaxLod)
790*35ffd701SAndroid Build Coastguard Worker     {
791*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid mip map chain specified!");
792*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
793*35ffd701SAndroid Build Coastguard Worker     }
794*35ffd701SAndroid Build Coastguard Worker 
795*35ffd701SAndroid Build Coastguard Worker     // MIPs are not supported for tiled Yf/Ys planar surfaces
796*35ffd701SAndroid Build Coastguard Worker     if((Surf.MaxLod) &&
797*35ffd701SAndroid Build Coastguard Worker        GmmIsPlanar(Surf.Format) &&
798*35ffd701SAndroid Build Coastguard Worker        (Surf.Flags.Info.TiledYf || GMM_IS_64KB_TILE(Surf.Flags)))
799*35ffd701SAndroid Build Coastguard Worker     {
800*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid mip map chain specified!");
801*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
802*35ffd701SAndroid Build Coastguard Worker     }
803*35ffd701SAndroid Build Coastguard Worker 
804*35ffd701SAndroid Build Coastguard Worker     // check depth buffer tilings
805*35ffd701SAndroid Build Coastguard Worker     if((Surf.Flags.Gpu.Depth == 1) &&
806*35ffd701SAndroid Build Coastguard Worker        (Surf.Flags.Info.TiledX == 1))
807*35ffd701SAndroid Build Coastguard Worker     {
808*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid Tiling for Depth Buffer!");
809*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
810*35ffd701SAndroid Build Coastguard Worker     }
811*35ffd701SAndroid Build Coastguard Worker 
812*35ffd701SAndroid Build Coastguard Worker #if DBG
813*35ffd701SAndroid Build Coastguard Worker     // Check if stencil buffer gpu flag is set w/ other flags
814*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.SeparateStencil == 1)
815*35ffd701SAndroid Build Coastguard Worker     {
816*35ffd701SAndroid Build Coastguard Worker         GMM_RESOURCE_FLAG OnlySeparateStencilGpuFlag;
817*35ffd701SAndroid Build Coastguard Worker 
818*35ffd701SAndroid Build Coastguard Worker         memset(&OnlySeparateStencilGpuFlag.Gpu, 0, sizeof(OnlySeparateStencilGpuFlag.Gpu));
819*35ffd701SAndroid Build Coastguard Worker         OnlySeparateStencilGpuFlag.Gpu.SeparateStencil = 1;
820*35ffd701SAndroid Build Coastguard Worker 
821*35ffd701SAndroid Build Coastguard Worker         if(memcmp(&Surf.Flags.Gpu, &OnlySeparateStencilGpuFlag.Gpu, sizeof(OnlySeparateStencilGpuFlag.Gpu)))
822*35ffd701SAndroid Build Coastguard Worker         {
823*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0,
824*35ffd701SAndroid Build Coastguard Worker                           "Should not set w/ other flags b/c vertical alignment is "
825*35ffd701SAndroid Build Coastguard Worker                           "unique for separate stencil and incompatible w/ other "
826*35ffd701SAndroid Build Coastguard Worker                           "usages such as render target.");
827*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
828*35ffd701SAndroid Build Coastguard Worker         }
829*35ffd701SAndroid Build Coastguard Worker     }
830*35ffd701SAndroid Build Coastguard Worker #endif
831*35ffd701SAndroid Build Coastguard Worker 
832*35ffd701SAndroid Build Coastguard Worker     // MSAA Restrictions
833*35ffd701SAndroid Build Coastguard Worker     if((Surf.MSAA.NumSamples > 1) &&
834*35ffd701SAndroid Build Coastguard Worker        !( //--- Legitimate MSAA Case ------------------------------------------
835*35ffd701SAndroid Build Coastguard Worker        (Surf.Type == RESOURCE_2D) &&
836*35ffd701SAndroid Build Coastguard Worker        (Surf.Flags.Gpu.Depth ||
837*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Gpu.HiZ ||
838*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Gpu.RenderTarget ||
839*35ffd701SAndroid Build Coastguard Worker         Surf.Flags.Gpu.SeparateStencil) &&
840*35ffd701SAndroid Build Coastguard Worker        // Single-LOD (pre-SKL)...
841*35ffd701SAndroid Build Coastguard Worker        ((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) >= IGFX_GEN9_CORE) ||
842*35ffd701SAndroid Build Coastguard Worker         (Surf.MaxLod == 0)) &&
843*35ffd701SAndroid Build Coastguard Worker        // TileYF cannot be MSAA'ed (pre-Gen10)...
844*35ffd701SAndroid Build Coastguard Worker        ((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) >= IGFX_GEN10_CORE) ||
845*35ffd701SAndroid Build Coastguard Worker         !Surf.Flags.Info.TiledYf) &&
846*35ffd701SAndroid Build Coastguard Worker        // Tile64 MSAA (Xe_HP)
847*35ffd701SAndroid Build Coastguard Worker        (GetGmmLibContext()->GetSkuTable().FtrTileY ||
848*35ffd701SAndroid Build Coastguard Worker         !GMM_IS_64KB_TILE(Surf.Flags) ||
849*35ffd701SAndroid Build Coastguard Worker         (Surf.MaxLod == 0)) &&
850*35ffd701SAndroid Build Coastguard Worker        // Tile4 does not support MSAA
851*35ffd701SAndroid Build Coastguard Worker        (GetGmmLibContext()->GetSkuTable().FtrTileY ||
852*35ffd701SAndroid Build Coastguard Worker         !GMM_IS_4KB_TILE(Surf.Flags)) &&
853*35ffd701SAndroid Build Coastguard Worker        // Non-Compressed/YUV...
854*35ffd701SAndroid Build Coastguard Worker        !GmmIsCompressed(GetGmmLibContext(), Surf.Format) &&
855*35ffd701SAndroid Build Coastguard Worker        !GmmIsYUVPacked(Surf.Format) &&
856*35ffd701SAndroid Build Coastguard Worker        !GmmIsPlanar(Surf.Format) &&
857*35ffd701SAndroid Build Coastguard Worker        // Supported Sample Count for Platform...
858*35ffd701SAndroid Build Coastguard Worker        (((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) >= IGFX_GEN7_CORE) &&
859*35ffd701SAndroid Build Coastguard Worker          ((Surf.MSAA.NumSamples == 4) || (Surf.MSAA.NumSamples == 8))) ||
860*35ffd701SAndroid Build Coastguard Worker         ((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) >= IGFX_GEN8_CORE) &&
861*35ffd701SAndroid Build Coastguard Worker          ((Surf.MSAA.NumSamples == 2))) ||
862*35ffd701SAndroid Build Coastguard Worker         ((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) >= IGFX_GEN9_CORE) &&
863*35ffd701SAndroid Build Coastguard Worker          ((Surf.MSAA.NumSamples == 16))))))
864*35ffd701SAndroid Build Coastguard Worker     {
865*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid MSAA usage!");
866*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
867*35ffd701SAndroid Build Coastguard Worker     }
868*35ffd701SAndroid Build Coastguard Worker 
869*35ffd701SAndroid Build Coastguard Worker     // CCS Restrictions
870*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.CCS)
871*35ffd701SAndroid Build Coastguard Worker     {
872*35ffd701SAndroid Build Coastguard Worker         if((Status = GetGmmLibContext()->GetPlatformInfoObj()->ValidateCCS(Surf)) == 0)
873*35ffd701SAndroid Build Coastguard Worker         {
874*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Invalid CCS usage!");
875*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
876*35ffd701SAndroid Build Coastguard Worker         }
877*35ffd701SAndroid Build Coastguard Worker 
878*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Info.RenderCompressed && Surf.Flags.Info.MediaCompressed)
879*35ffd701SAndroid Build Coastguard Worker         {
880*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Invalid CCS usage - can't be both RC and MC!");
881*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
882*35ffd701SAndroid Build Coastguard Worker         }
883*35ffd701SAndroid Build Coastguard Worker     }
884*35ffd701SAndroid Build Coastguard Worker 
885*35ffd701SAndroid Build Coastguard Worker     // UnifiedAuxSurface Restrictions
886*35ffd701SAndroid Build Coastguard Worker     if((Status = GetGmmLibContext()->GetPlatformInfoObj()->ValidateUnifiedAuxSurface(Surf)) == 0)
887*35ffd701SAndroid Build Coastguard Worker     {
888*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid UnifiedAuxSurface usage!");
889*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
890*35ffd701SAndroid Build Coastguard Worker     }
891*35ffd701SAndroid Build Coastguard Worker 
892*35ffd701SAndroid Build Coastguard Worker     // IndirectClearColor Restrictions
893*35ffd701SAndroid Build Coastguard Worker     if((Surf.Flags.Gpu.IndirectClearColor) &&
894*35ffd701SAndroid Build Coastguard Worker        !( //--- Legitimate IndirectClearColor Case ------------------------------------------
895*35ffd701SAndroid Build Coastguard Worker         (((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) >= IGFX_GEN9_CORE) && Surf.Flags.Gpu.UnifiedAuxSurface) ||
896*35ffd701SAndroid Build Coastguard Worker          ((GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) > IGFX_GEN11_CORE) && (Surf.Flags.Gpu.HiZ || Surf.Flags.Gpu.SeparateStencil)))))
897*35ffd701SAndroid Build Coastguard Worker 
898*35ffd701SAndroid Build Coastguard Worker     {
899*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid IndirectClearColor usage!");
900*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
901*35ffd701SAndroid Build Coastguard Worker     }
902*35ffd701SAndroid Build Coastguard Worker 
903*35ffd701SAndroid Build Coastguard Worker     // CornerTexelMode Restrictions
904*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Info.CornerTexelMode &&
905*35ffd701SAndroid Build Coastguard Worker        (!( //--- Legitimate CornerTexelMode Case -------------------------------------------
906*35ffd701SAndroid Build Coastguard Worker        (GFX_GET_CURRENT_RENDERCORE(pPlatformResource->Platform) >= IGFX_GEN11_CORE) &&
907*35ffd701SAndroid Build Coastguard Worker        (!GmmIsPlanar(Surf.Format)) &&
908*35ffd701SAndroid Build Coastguard Worker        (!Surf.Flags.Info.StdSwizzle))))
909*35ffd701SAndroid Build Coastguard Worker     {
910*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Flag.Info.CornerTexelMode not supported on this platform.");
911*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
912*35ffd701SAndroid Build Coastguard Worker     }
913*35ffd701SAndroid Build Coastguard Worker 
914*35ffd701SAndroid Build Coastguard Worker  //MultiTileArch params
915*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetSkuTable().FtrMultiTileArch)
916*35ffd701SAndroid Build Coastguard Worker     {
917*35ffd701SAndroid Build Coastguard Worker         /*
918*35ffd701SAndroid Build Coastguard Worker             MultiTileArch validation criteria
919*35ffd701SAndroid Build Coastguard Worker             - MultiTileArch.Enable must be set.
920*35ffd701SAndroid Build Coastguard Worker             - NonLocalOnly alloc must have LocalEligibilitySet and LocalPreferenceSet both zero
921*35ffd701SAndroid Build Coastguard Worker             - LocalOnly alloc must have non-zero LocalEligibilitySet
922*35ffd701SAndroid Build Coastguard Worker             - GpuVaMappingSet/LocalEligibilitySet must be subset of GtSysInfo.TileMask
923*35ffd701SAndroid Build Coastguard Worker             - PreferredSet must be subset of EligibilitySet or zero
924*35ffd701SAndroid Build Coastguard Worker         */
925*35ffd701SAndroid Build Coastguard Worker         if(!(
926*35ffd701SAndroid Build Coastguard Worker            // Legitimate cases
927*35ffd701SAndroid Build Coastguard Worker            MultiTileArch.Enable &&
928*35ffd701SAndroid Build Coastguard Worker            (Surf.Flags.Info.NonLocalOnly || MultiTileArch.LocalMemEligibilitySet) &&
929*35ffd701SAndroid Build Coastguard Worker            ((MultiTileArch.GpuVaMappingSet & GetGmmLibContext()->GetGtSysInfo()->MultiTileArchInfo.TileMask) == MultiTileArch.GpuVaMappingSet) &&
930*35ffd701SAndroid Build Coastguard Worker            ((MultiTileArch.LocalMemEligibilitySet & GetGmmLibContext()->GetGtSysInfo()->MultiTileArchInfo.TileMask) == MultiTileArch.LocalMemEligibilitySet) &&
931*35ffd701SAndroid Build Coastguard Worker            ((MultiTileArch.LocalMemEligibilitySet & MultiTileArch.LocalMemPreferredSet) == MultiTileArch.LocalMemPreferredSet)))
932*35ffd701SAndroid Build Coastguard Worker         {
933*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Invalid MultiTileArch allocation params");
934*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
935*35ffd701SAndroid Build Coastguard Worker         }
936*35ffd701SAndroid Build Coastguard Worker     }
937*35ffd701SAndroid Build Coastguard Worker 
938*35ffd701SAndroid Build Coastguard Worker     // check 2D, 3D & Cubemap dimensions
939*35ffd701SAndroid Build Coastguard Worker     switch(Surf.Type)
940*35ffd701SAndroid Build Coastguard Worker     {
941*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_1D:
942*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_2D:
943*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_3D:
944*35ffd701SAndroid Build Coastguard Worker         {
945*35ffd701SAndroid Build Coastguard Worker             if(!Surf.BaseWidth || !Surf.BaseHeight)
946*35ffd701SAndroid Build Coastguard Worker             {
947*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Width or Height is 0!");
948*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
949*35ffd701SAndroid Build Coastguard Worker             }
950*35ffd701SAndroid Build Coastguard Worker             break;
951*35ffd701SAndroid Build Coastguard Worker         }
952*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_CUBE:
953*35ffd701SAndroid Build Coastguard Worker         {
954*35ffd701SAndroid Build Coastguard Worker             if(!Surf.BaseWidth || !Surf.BaseHeight)
955*35ffd701SAndroid Build Coastguard Worker             {
956*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Cubemap Dimensions invalid!");
957*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
958*35ffd701SAndroid Build Coastguard Worker             }
959*35ffd701SAndroid Build Coastguard Worker             if(Surf.BaseWidth != Surf.BaseHeight)
960*35ffd701SAndroid Build Coastguard Worker             {
961*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Cubemap Dimensions invalid (width != Height)!");
962*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
963*35ffd701SAndroid Build Coastguard Worker             }
964*35ffd701SAndroid Build Coastguard Worker             break;
965*35ffd701SAndroid Build Coastguard Worker         }
966*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_SCRATCH:
967*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_BUFFER:
968*35ffd701SAndroid Build Coastguard Worker         {
969*35ffd701SAndroid Build Coastguard Worker             if(Surf.BaseHeight != 1)
970*35ffd701SAndroid Build Coastguard Worker             {
971*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Linear surface height not 1!");
972*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
973*35ffd701SAndroid Build Coastguard Worker             }
974*35ffd701SAndroid Build Coastguard Worker             break;
975*35ffd701SAndroid Build Coastguard Worker         }
976*35ffd701SAndroid Build Coastguard Worker         default:
977*35ffd701SAndroid Build Coastguard Worker             if (!Surf.BaseWidth || !Surf.BaseHeight)
978*35ffd701SAndroid Build Coastguard Worker             {
979*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Width or Height is 0!");
980*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
981*35ffd701SAndroid Build Coastguard Worker             }
982*35ffd701SAndroid Build Coastguard Worker             break;
983*35ffd701SAndroid Build Coastguard Worker     }
984*35ffd701SAndroid Build Coastguard Worker 
985*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
986*35ffd701SAndroid Build Coastguard Worker     return 1;
987*35ffd701SAndroid Build Coastguard Worker 
988*35ffd701SAndroid Build Coastguard Worker ERROR_CASE:
989*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(0);
990*35ffd701SAndroid Build Coastguard Worker     return 0;
991*35ffd701SAndroid Build Coastguard Worker }
992*35ffd701SAndroid Build Coastguard Worker 
993*35ffd701SAndroid Build Coastguard Worker //=============================================================================
994*35ffd701SAndroid Build Coastguard Worker //
995*35ffd701SAndroid Build Coastguard Worker // Function: GetDisplayCompressionSupport
996*35ffd701SAndroid Build Coastguard Worker //
997*35ffd701SAndroid Build Coastguard Worker // Desc: Returns true if display hw supports lossless render/media decompression
998*35ffd701SAndroid Build Coastguard Worker //       else returns false.
999*35ffd701SAndroid Build Coastguard Worker //       Umds can call it to decide if full resolve is required
1000*35ffd701SAndroid Build Coastguard Worker //
1001*35ffd701SAndroid Build Coastguard Worker // Parameters:
1002*35ffd701SAndroid Build Coastguard Worker //      See function arguments.
1003*35ffd701SAndroid Build Coastguard Worker //
1004*35ffd701SAndroid Build Coastguard Worker // Returns:
1005*35ffd701SAndroid Build Coastguard Worker //      uint8_t
1006*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GetDisplayCompressionSupport()1007*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetDisplayCompressionSupport()
1008*35ffd701SAndroid Build Coastguard Worker {
1009*35ffd701SAndroid Build Coastguard Worker     uint8_t             ComprSupported = 0;
1010*35ffd701SAndroid Build Coastguard Worker     GMM_RESOURCE_FORMAT Format         = Surf.Format;
1011*35ffd701SAndroid Build Coastguard Worker 
1012*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.UnifiedAuxSurface)
1013*35ffd701SAndroid Build Coastguard Worker     {
1014*35ffd701SAndroid Build Coastguard Worker         bool IsSupportedRGB64_16_16_16_16 = false;
1015*35ffd701SAndroid Build Coastguard Worker         bool IsSupportedRGB32_8_8_8_8     = false;
1016*35ffd701SAndroid Build Coastguard Worker         bool IsSupportedRGB32_2_10_10_10  = false;
1017*35ffd701SAndroid Build Coastguard Worker         bool IsSupportedMediaFormats      = false;
1018*35ffd701SAndroid Build Coastguard Worker 
1019*35ffd701SAndroid Build Coastguard Worker         switch(Format) //RGB64 16:16 : 16 : 16 FP16
1020*35ffd701SAndroid Build Coastguard Worker         {
1021*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R16G16B16A16_FLOAT:
1022*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R16G16B16X16_FLOAT:
1023*35ffd701SAndroid Build Coastguard Worker                 IsSupportedRGB64_16_16_16_16 = true;
1024*35ffd701SAndroid Build Coastguard Worker             default:
1025*35ffd701SAndroid Build Coastguard Worker                 break;
1026*35ffd701SAndroid Build Coastguard Worker         }
1027*35ffd701SAndroid Build Coastguard Worker 
1028*35ffd701SAndroid Build Coastguard Worker         switch(Format) //RGB32 8 : 8 : 8 : 8
1029*35ffd701SAndroid Build Coastguard Worker         {
1030*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B8G8R8A8_UNORM:
1031*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8A8_UNORM:
1032*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B8G8R8X8_UNORM:
1033*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8X8_UNORM:
1034*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8A8_UNORM_SRGB:
1035*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B8X8_UNORM_G8R8_SNORM:
1036*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_X8B8_UNORM_G8R8_SNORM:
1037*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_A8X8_UNORM_G8R8_SNORM:
1038*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B8G8R8A8_UNORM_SRGB:
1039*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B8G8R8X8_UNORM_SRGB:
1040*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8A8_SINT:
1041*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8A8_SNORM:
1042*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8A8_SSCALED:
1043*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8A8_UINT:
1044*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8A8_USCALED:
1045*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R8G8B8X8_UNORM_SRGB:
1046*35ffd701SAndroid Build Coastguard Worker                 IsSupportedRGB32_8_8_8_8 = true;
1047*35ffd701SAndroid Build Coastguard Worker             default:
1048*35ffd701SAndroid Build Coastguard Worker                 break;
1049*35ffd701SAndroid Build Coastguard Worker         }
1050*35ffd701SAndroid Build Coastguard Worker 
1051*35ffd701SAndroid Build Coastguard Worker         switch(Format) //RGB32 2 : 10 : 10 : 10
1052*35ffd701SAndroid Build Coastguard Worker         {
1053*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10X2_UNORM:
1054*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10A2_UNORM:
1055*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10A2_UNORM:
1056*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10A2_SINT:
1057*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10A2_SNORM:
1058*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10A2_SSCALED:
1059*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10A2_UINT:
1060*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10A2_UNORM_SRGB:
1061*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_B10G10R10A2_USCALED:
1062*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10_FLOAT_A2_UNORM:
1063*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10_SNORM_A2_UNORM:
1064*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10A2_SINT:
1065*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10A2_SNORM:
1066*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10A2_SSCALED:
1067*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10A2_UINT:
1068*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10A2_UNORM_SRGB:
1069*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10A2_USCALED:
1070*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10X2_USCALED:
1071*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
1072*35ffd701SAndroid Build Coastguard Worker                 IsSupportedRGB32_2_10_10_10 = true;
1073*35ffd701SAndroid Build Coastguard Worker             default:
1074*35ffd701SAndroid Build Coastguard Worker                 break;
1075*35ffd701SAndroid Build Coastguard Worker         }
1076*35ffd701SAndroid Build Coastguard Worker 
1077*35ffd701SAndroid Build Coastguard Worker         switch(Format)
1078*35ffd701SAndroid Build Coastguard Worker         {
1079*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_YUY2: //YUV422 8 bpc
1080*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_NV12: //YUV420 - NV12
1081*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_P010: //YUV420 - P0xx
1082*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_P016:
1083*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_Y210: //YUV422 - Y210, Y212, Y216
1084*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_Y216:
1085*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_Y410: //YUV444 - Y410
1086*35ffd701SAndroid Build Coastguard Worker             case GMM_FORMAT_Y416:
1087*35ffd701SAndroid Build Coastguard Worker                 IsSupportedMediaFormats = true; //YUV444 - Y412, Y416
1088*35ffd701SAndroid Build Coastguard Worker             default:
1089*35ffd701SAndroid Build Coastguard Worker                 break;
1090*35ffd701SAndroid Build Coastguard Worker         }
1091*35ffd701SAndroid Build Coastguard Worker 
1092*35ffd701SAndroid Build Coastguard Worker         //Check fmt is display decompressible
1093*35ffd701SAndroid Build Coastguard Worker         ComprSupported = GetGmmLibContext()->GetPlatformInfoObj()->CheckFmtDisplayDecompressible(Surf, IsSupportedRGB64_16_16_16_16,
1094*35ffd701SAndroid Build Coastguard Worker                                                                                                 IsSupportedRGB32_8_8_8_8, IsSupportedRGB32_2_10_10_10,
1095*35ffd701SAndroid Build Coastguard Worker                                                                                                 IsSupportedMediaFormats);
1096*35ffd701SAndroid Build Coastguard Worker     }
1097*35ffd701SAndroid Build Coastguard Worker 
1098*35ffd701SAndroid Build Coastguard Worker     return ComprSupported;
1099*35ffd701SAndroid Build Coastguard Worker }
1100*35ffd701SAndroid Build Coastguard Worker 
1101*35ffd701SAndroid Build Coastguard Worker //=============================================================================
1102*35ffd701SAndroid Build Coastguard Worker //
1103*35ffd701SAndroid Build Coastguard Worker // Function: GetDisplayFastClearSupport
1104*35ffd701SAndroid Build Coastguard Worker //
1105*35ffd701SAndroid Build Coastguard Worker // Desc: Returns 1 if display hw supports fast clear else returns 0.
1106*35ffd701SAndroid Build Coastguard Worker //       Umds can call it to decide if FC resolve is required
1107*35ffd701SAndroid Build Coastguard Worker //
1108*35ffd701SAndroid Build Coastguard Worker // Parameters:
1109*35ffd701SAndroid Build Coastguard Worker //      See function arguments.
1110*35ffd701SAndroid Build Coastguard Worker //
1111*35ffd701SAndroid Build Coastguard Worker // Returns:
1112*35ffd701SAndroid Build Coastguard Worker //      uint8_t
1113*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GetDisplayFastClearSupport()1114*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetDisplayFastClearSupport()
1115*35ffd701SAndroid Build Coastguard Worker {
1116*35ffd701SAndroid Build Coastguard Worker     uint8_t FCSupported = 0;
1117*35ffd701SAndroid Build Coastguard Worker 
1118*35ffd701SAndroid Build Coastguard Worker     if(GFX_GET_CURRENT_RENDERCORE(GetGmmLibContext()->GetPlatformInfo().Platform) >= IGFX_GEN11_CORE)
1119*35ffd701SAndroid Build Coastguard Worker     {
1120*35ffd701SAndroid Build Coastguard Worker         FCSupported = GetDisplayCompressionSupport() && !GmmIsPlanar(Surf.Format);
1121*35ffd701SAndroid Build Coastguard Worker         FCSupported &= Surf.Flags.Gpu.IndirectClearColor;
1122*35ffd701SAndroid Build Coastguard Worker     }
1123*35ffd701SAndroid Build Coastguard Worker 
1124*35ffd701SAndroid Build Coastguard Worker     return FCSupported;
1125*35ffd701SAndroid Build Coastguard Worker }
1126