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