xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Resource/GmmRestrictions.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 #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker 
25*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
26*35ffd701SAndroid Build Coastguard Worker /// Checks that clients only set Presentable flag during a resource allocation, ONLY
27*35ffd701SAndroid Build Coastguard Worker /// when a platform supported render target is selected in ::GMM_RESOURCE_FORMAT enum.
28*35ffd701SAndroid Build Coastguard Worker ///
29*35ffd701SAndroid Build Coastguard Worker /// @return true if displayable, false otherwise.
30*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
IsPresentableformat()31*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmResourceInfoCommon::IsPresentableformat()
32*35ffd701SAndroid Build Coastguard Worker {
33*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
34*35ffd701SAndroid Build Coastguard Worker     const GMM_FORMAT_ENTRY * FormatTable = NULL;
35*35ffd701SAndroid Build Coastguard Worker 
36*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
37*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(GetGmmLibContext(), false);
38*35ffd701SAndroid Build Coastguard Worker 
39*35ffd701SAndroid Build Coastguard Worker     pPlatform   = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
40*35ffd701SAndroid Build Coastguard Worker     FormatTable = &(pPlatform->FormatTable[0]);
41*35ffd701SAndroid Build Coastguard Worker 
42*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.Presentable == false)
43*35ffd701SAndroid Build Coastguard Worker     {
44*35ffd701SAndroid Build Coastguard Worker         // When Presentable flag is not set, no reason to check for valid RT
45*35ffd701SAndroid Build Coastguard Worker         // platform supported format. Safe to return true.
46*35ffd701SAndroid Build Coastguard Worker         return true;
47*35ffd701SAndroid Build Coastguard Worker     }
48*35ffd701SAndroid Build Coastguard Worker 
49*35ffd701SAndroid Build Coastguard Worker     if((Surf.Format > GMM_FORMAT_INVALID) &&
50*35ffd701SAndroid Build Coastguard Worker        (Surf.Format < GMM_RESOURCE_FORMATS))
51*35ffd701SAndroid Build Coastguard Worker     {
52*35ffd701SAndroid Build Coastguard Worker         if((FormatTable[Surf.Format].RenderTarget) &&
53*35ffd701SAndroid Build Coastguard Worker            (FormatTable[Surf.Format].Supported))
54*35ffd701SAndroid Build Coastguard Worker         {
55*35ffd701SAndroid Build Coastguard Worker             return true;
56*35ffd701SAndroid Build Coastguard Worker         }
57*35ffd701SAndroid Build Coastguard Worker         else
58*35ffd701SAndroid Build Coastguard Worker         {
59*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Present flag can only be set w/ a format!");
60*35ffd701SAndroid Build Coastguard Worker             return false;
61*35ffd701SAndroid Build Coastguard Worker         }
62*35ffd701SAndroid Build Coastguard Worker     }
63*35ffd701SAndroid Build Coastguard Worker 
64*35ffd701SAndroid Build Coastguard Worker     return false;
65*35ffd701SAndroid Build Coastguard Worker }
66*35ffd701SAndroid Build Coastguard Worker 
67*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
68*35ffd701SAndroid Build Coastguard Worker /// Returns the restrictions that a particular resource must follow on a particular
69*35ffd701SAndroid Build Coastguard Worker /// OS or hardware.
70*35ffd701SAndroid Build Coastguard Worker ///
71*35ffd701SAndroid Build Coastguard Worker /// @param[out]  Restrictions: restrictions that this resource must adhere to
72*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetRestrictions(__GMM_BUFFER_TYPE & Restrictions)73*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmResourceInfoCommon::GetRestrictions(__GMM_BUFFER_TYPE &Restrictions)
74*35ffd701SAndroid Build Coastguard Worker {
75*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
76*35ffd701SAndroid Build Coastguard Worker 
77*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc = NULL;
78*35ffd701SAndroid Build Coastguard Worker     pTextureCalc                   = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
79*35ffd701SAndroid Build Coastguard Worker     if (pTextureCalc)
80*35ffd701SAndroid Build Coastguard Worker     {
81*35ffd701SAndroid Build Coastguard Worker         pTextureCalc->GetResRestrictions(&Surf, Restrictions);
82*35ffd701SAndroid Build Coastguard Worker     }
83*35ffd701SAndroid Build Coastguard Worker 
84*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
85*35ffd701SAndroid Build Coastguard Worker }
86*35ffd701SAndroid Build Coastguard Worker 
87*35ffd701SAndroid Build Coastguard Worker 
88*35ffd701SAndroid Build Coastguard Worker //=============================================================================
89*35ffd701SAndroid Build Coastguard Worker //
90*35ffd701SAndroid Build Coastguard Worker // Function: GmmResGetRestrictions
91*35ffd701SAndroid Build Coastguard Worker //
92*35ffd701SAndroid Build Coastguard Worker // Desc: This routine returns resource restrictions
93*35ffd701SAndroid Build Coastguard Worker //
94*35ffd701SAndroid Build Coastguard Worker // Parameters:
95*35ffd701SAndroid Build Coastguard Worker //      pPlatform: ptr to HW_DEVICE_EXTENSION
96*35ffd701SAndroid Build Coastguard Worker //      pResourceInfo: ptr to GMM_RESOURCE_INFO
97*35ffd701SAndroid Build Coastguard Worker //      pRestrictions: ptr to restrictions
98*35ffd701SAndroid Build Coastguard Worker //
99*35ffd701SAndroid Build Coastguard Worker // Returns:
100*35ffd701SAndroid Build Coastguard Worker //      void
101*35ffd701SAndroid Build Coastguard Worker //
102*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GmmResGetRestrictions(GMM_RESOURCE_INFO * pResourceInfo,__GMM_BUFFER_TYPE * pRestrictions)103*35ffd701SAndroid Build Coastguard Worker void GMM_STDCALL GmmResGetRestrictions(GMM_RESOURCE_INFO *pResourceInfo,
104*35ffd701SAndroid Build Coastguard Worker                                        __GMM_BUFFER_TYPE *pRestrictions)
105*35ffd701SAndroid Build Coastguard Worker {
106*35ffd701SAndroid Build Coastguard Worker     pResourceInfo->GetRestrictions(*pRestrictions);
107*35ffd701SAndroid Build Coastguard Worker }
108*35ffd701SAndroid Build Coastguard Worker 
109*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
110*35ffd701SAndroid Build Coastguard Worker /// Returns the best restrictions by comparing two buffer types. Each buffer type
111*35ffd701SAndroid Build Coastguard Worker /// carries alignment and size restrictions.
112*35ffd701SAndroid Build Coastguard Worker ///
113*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pFirstBuffer: Contains surface alignment and size restrictions
114*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pSecondBuffer: Contains surface alignment and size restrictions
115*35ffd701SAndroid Build Coastguard Worker ///
116*35ffd701SAndroid Build Coastguard Worker /// @return     Best Restrictions based on the two parameters passed
117*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetBestRestrictions(__GMM_BUFFER_TYPE * pFirstBuffer,const __GMM_BUFFER_TYPE * pSecondBuffer)118*35ffd701SAndroid Build Coastguard Worker __GMM_BUFFER_TYPE *GmmLib::GmmTextureCalc::GetBestRestrictions(__GMM_BUFFER_TYPE *      pFirstBuffer,
119*35ffd701SAndroid Build Coastguard Worker                                                                const __GMM_BUFFER_TYPE *pSecondBuffer)
120*35ffd701SAndroid Build Coastguard Worker {
121*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
122*35ffd701SAndroid Build Coastguard Worker 
123*35ffd701SAndroid Build Coastguard Worker     if(IsRestrictionInvalid(pFirstBuffer)) //default
124*35ffd701SAndroid Build Coastguard Worker     {
125*35ffd701SAndroid Build Coastguard Worker         *pFirstBuffer = *pSecondBuffer;
126*35ffd701SAndroid Build Coastguard Worker         return pFirstBuffer;
127*35ffd701SAndroid Build Coastguard Worker     }
128*35ffd701SAndroid Build Coastguard Worker 
129*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->Alignment = GFX_MAX(pFirstBuffer->Alignment,
130*35ffd701SAndroid Build Coastguard Worker                                       pSecondBuffer->Alignment);
131*35ffd701SAndroid Build Coastguard Worker 
132*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->PitchAlignment = GFX_MAX(pFirstBuffer->PitchAlignment,
133*35ffd701SAndroid Build Coastguard Worker                                            pSecondBuffer->PitchAlignment);
134*35ffd701SAndroid Build Coastguard Worker 
135*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->RenderPitchAlignment = GFX_MAX(pFirstBuffer->RenderPitchAlignment,
136*35ffd701SAndroid Build Coastguard Worker                                                  pSecondBuffer->RenderPitchAlignment);
137*35ffd701SAndroid Build Coastguard Worker 
138*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->LockPitchAlignment = GFX_MAX(pFirstBuffer->LockPitchAlignment,
139*35ffd701SAndroid Build Coastguard Worker                                                pSecondBuffer->LockPitchAlignment);
140*35ffd701SAndroid Build Coastguard Worker 
141*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MinPitch = GFX_MAX(pFirstBuffer->MinPitch,
142*35ffd701SAndroid Build Coastguard Worker                                      pSecondBuffer->MinPitch);
143*35ffd701SAndroid Build Coastguard Worker 
144*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MinAllocationSize = GFX_MAX(pFirstBuffer->MinAllocationSize,
145*35ffd701SAndroid Build Coastguard Worker                                               pSecondBuffer->MinAllocationSize);
146*35ffd701SAndroid Build Coastguard Worker 
147*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MinDepth = GFX_MAX(pFirstBuffer->MinDepth,
148*35ffd701SAndroid Build Coastguard Worker                                      pSecondBuffer->MinDepth);
149*35ffd701SAndroid Build Coastguard Worker 
150*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MinHeight = GFX_MAX(pFirstBuffer->MinHeight,
151*35ffd701SAndroid Build Coastguard Worker                                       pSecondBuffer->MinHeight);
152*35ffd701SAndroid Build Coastguard Worker 
153*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MinWidth = GFX_MAX(pFirstBuffer->MinWidth,
154*35ffd701SAndroid Build Coastguard Worker                                      pSecondBuffer->MinWidth);
155*35ffd701SAndroid Build Coastguard Worker 
156*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MaxDepth = GFX_MIN(pFirstBuffer->MaxDepth,
157*35ffd701SAndroid Build Coastguard Worker                                      pSecondBuffer->MaxDepth);
158*35ffd701SAndroid Build Coastguard Worker 
159*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MaxHeight = GFX_MIN(pFirstBuffer->MaxHeight,
160*35ffd701SAndroid Build Coastguard Worker                                       pSecondBuffer->MaxHeight);
161*35ffd701SAndroid Build Coastguard Worker 
162*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->MaxWidth = GFX_MIN(pFirstBuffer->MaxWidth,
163*35ffd701SAndroid Build Coastguard Worker                                      pSecondBuffer->MaxWidth);
164*35ffd701SAndroid Build Coastguard Worker 
165*35ffd701SAndroid Build Coastguard Worker     pFirstBuffer->NeedPow2LockAlignment = pFirstBuffer->NeedPow2LockAlignment |
166*35ffd701SAndroid Build Coastguard Worker                                           pSecondBuffer->NeedPow2LockAlignment;
167*35ffd701SAndroid Build Coastguard Worker 
168*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
169*35ffd701SAndroid Build Coastguard Worker     return pFirstBuffer;
170*35ffd701SAndroid Build Coastguard Worker }
171*35ffd701SAndroid Build Coastguard Worker 
172*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
173*35ffd701SAndroid Build Coastguard Worker /// Returns restrictions for 1D, 2D, 3D textures depending on how the surface
174*35ffd701SAndroid Build Coastguard Worker /// may possibliy be used.
175*35ffd701SAndroid Build Coastguard Worker ///
176*35ffd701SAndroid Build Coastguard Worker /// @param[out]  pBuff: Restrictions filled in this struct
177*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetGenericRestrictions(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pBuff)178*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::GetGenericRestrictions(GMM_TEXTURE_INFO *pTexInfo, __GMM_BUFFER_TYPE *pBuff)
179*35ffd701SAndroid Build Coastguard Worker {
180*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
181*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatformResource = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, pGmmLibContext);
182*35ffd701SAndroid Build Coastguard Worker 
183*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.NoRestriction)
184*35ffd701SAndroid Build Coastguard Worker     {
185*35ffd701SAndroid Build Coastguard Worker         // Impose zero restrictions. Ignore any other GPU usage flags
186*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->NoRestriction);
187*35ffd701SAndroid Build Coastguard Worker         return;
188*35ffd701SAndroid Build Coastguard Worker     }
189*35ffd701SAndroid Build Coastguard Worker 
190*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Texture)
191*35ffd701SAndroid Build Coastguard Worker     {
192*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Type == RESOURCE_BUFFER)
193*35ffd701SAndroid Build Coastguard Worker         {
194*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->BufferType;
195*35ffd701SAndroid Build Coastguard Worker         }
196*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Type == RESOURCE_CUBE)
197*35ffd701SAndroid Build Coastguard Worker         {
198*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->CubeSurface;
199*35ffd701SAndroid Build Coastguard Worker         }
200*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Type == RESOURCE_3D)
201*35ffd701SAndroid Build Coastguard Worker         {
202*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->Texture3DSurface;
203*35ffd701SAndroid Build Coastguard Worker         }
204*35ffd701SAndroid Build Coastguard Worker         else
205*35ffd701SAndroid Build Coastguard Worker         {
206*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->Texture2DSurface;
207*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.Linear)
208*35ffd701SAndroid Build Coastguard Worker             {
209*35ffd701SAndroid Build Coastguard Worker                 *pBuff = pPlatformResource->Texture2DLinearSurface;
210*35ffd701SAndroid Build Coastguard Worker             }
211*35ffd701SAndroid Build Coastguard Worker             if(GmmIsReconstructableSurface(pTexInfo->Format))
212*35ffd701SAndroid Build Coastguard Worker             {
213*35ffd701SAndroid Build Coastguard Worker                 pBuff->MaxHeight = pPlatformResource->ReconMaxHeight;
214*35ffd701SAndroid Build Coastguard Worker                 pBuff->MaxWidth  = pPlatformResource->ReconMaxWidth;
215*35ffd701SAndroid Build Coastguard Worker             }
216*35ffd701SAndroid Build Coastguard Worker         }
217*35ffd701SAndroid Build Coastguard Worker     }
218*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.RenderTarget ||
219*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.CCS ||
220*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.MCS)
221*35ffd701SAndroid Build Coastguard Worker     {
222*35ffd701SAndroid Build Coastguard Worker         // Gen7 onwards, bound by SURFACE_STATE constraints.
223*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Type == RESOURCE_BUFFER)
224*35ffd701SAndroid Build Coastguard Worker         {
225*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->BufferType;
226*35ffd701SAndroid Build Coastguard Worker         }
227*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Type == RESOURCE_CUBE)
228*35ffd701SAndroid Build Coastguard Worker         {
229*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->CubeSurface;
230*35ffd701SAndroid Build Coastguard Worker         }
231*35ffd701SAndroid Build Coastguard Worker         else if(pTexInfo->Type == RESOURCE_3D)
232*35ffd701SAndroid Build Coastguard Worker         {
233*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->Texture3DSurface;
234*35ffd701SAndroid Build Coastguard Worker         }
235*35ffd701SAndroid Build Coastguard Worker         else
236*35ffd701SAndroid Build Coastguard Worker         {
237*35ffd701SAndroid Build Coastguard Worker             *pBuff = pPlatformResource->Texture2DSurface;
238*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.Linear)
239*35ffd701SAndroid Build Coastguard Worker             {
240*35ffd701SAndroid Build Coastguard Worker                 *pBuff = pPlatformResource->Texture2DLinearSurface;
241*35ffd701SAndroid Build Coastguard Worker             }
242*35ffd701SAndroid Build Coastguard Worker             if(GmmIsReconstructableSurface(pTexInfo->Format))
243*35ffd701SAndroid Build Coastguard Worker             {
244*35ffd701SAndroid Build Coastguard Worker                 pBuff->MaxHeight = pPlatformResource->ReconMaxHeight;
245*35ffd701SAndroid Build Coastguard Worker                 pBuff->MaxWidth  = pPlatformResource->ReconMaxWidth;
246*35ffd701SAndroid Build Coastguard Worker             }
247*35ffd701SAndroid Build Coastguard Worker         }
248*35ffd701SAndroid Build Coastguard Worker     }
249*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Depth)
250*35ffd701SAndroid Build Coastguard Worker     {
251*35ffd701SAndroid Build Coastguard Worker         // Z
252*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Depth);
253*35ffd701SAndroid Build Coastguard Worker     }
254*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Vertex)
255*35ffd701SAndroid Build Coastguard Worker     {
256*35ffd701SAndroid Build Coastguard Worker         // VertexData
257*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Vertex);
258*35ffd701SAndroid Build Coastguard Worker     }
259*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Index)
260*35ffd701SAndroid Build Coastguard Worker     {
261*35ffd701SAndroid Build Coastguard Worker         // Index buffer
262*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Index);
263*35ffd701SAndroid Build Coastguard Worker     }
264*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.FlipChain)
265*35ffd701SAndroid Build Coastguard Worker     {
266*35ffd701SAndroid Build Coastguard Worker         // Async Flip
267*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->ASyncFlipSurface);
268*35ffd701SAndroid Build Coastguard Worker     }
269*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.MotionComp)
270*35ffd701SAndroid Build Coastguard Worker     {
271*35ffd701SAndroid Build Coastguard Worker         // Media buffer
272*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->MotionComp);
273*35ffd701SAndroid Build Coastguard Worker     }
274*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.State ||
275*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.InstructionFlat ||
276*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.ScratchFlat)
277*35ffd701SAndroid Build Coastguard Worker     {
278*35ffd701SAndroid Build Coastguard Worker         // indirect state
279*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Vertex);
280*35ffd701SAndroid Build Coastguard Worker     }
281*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Query ||
282*35ffd701SAndroid Build Coastguard Worker        pTexInfo->Flags.Gpu.HistoryBuffer)
283*35ffd701SAndroid Build Coastguard Worker     {
284*35ffd701SAndroid Build Coastguard Worker         // Query
285*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->NoRestriction);
286*35ffd701SAndroid Build Coastguard Worker     }
287*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Constant)
288*35ffd701SAndroid Build Coastguard Worker     {
289*35ffd701SAndroid Build Coastguard Worker         //
290*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Constant);
291*35ffd701SAndroid Build Coastguard Worker     }
292*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Stream)
293*35ffd701SAndroid Build Coastguard Worker     {
294*35ffd701SAndroid Build Coastguard Worker         //
295*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Stream);
296*35ffd701SAndroid Build Coastguard Worker     }
297*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.InterlacedScan)
298*35ffd701SAndroid Build Coastguard Worker     {
299*35ffd701SAndroid Build Coastguard Worker         //
300*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->InterlacedScan);
301*35ffd701SAndroid Build Coastguard Worker     }
302*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.TextApi)
303*35ffd701SAndroid Build Coastguard Worker     {
304*35ffd701SAndroid Build Coastguard Worker         //
305*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->TextApi);
306*35ffd701SAndroid Build Coastguard Worker     }
307*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.SeparateStencil)
308*35ffd701SAndroid Build Coastguard Worker     {
309*35ffd701SAndroid Build Coastguard Worker         //
310*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Stencil);
311*35ffd701SAndroid Build Coastguard Worker     }
312*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.HiZ)
313*35ffd701SAndroid Build Coastguard Worker     {
314*35ffd701SAndroid Build Coastguard Worker         //
315*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->HiZ);
316*35ffd701SAndroid Build Coastguard Worker     }
317*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Video)
318*35ffd701SAndroid Build Coastguard Worker     {
319*35ffd701SAndroid Build Coastguard Worker         //
320*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Video);
321*35ffd701SAndroid Build Coastguard Worker         if(GmmIsReconstructableSurface(pTexInfo->Format))
322*35ffd701SAndroid Build Coastguard Worker         {
323*35ffd701SAndroid Build Coastguard Worker             pBuff->MaxHeight = pPlatformResource->ReconMaxHeight;
324*35ffd701SAndroid Build Coastguard Worker             pBuff->MaxWidth  = pPlatformResource->ReconMaxWidth;
325*35ffd701SAndroid Build Coastguard Worker         }
326*35ffd701SAndroid Build Coastguard Worker     }
327*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.StateDx9ConstantBuffer)
328*35ffd701SAndroid Build Coastguard Worker     {
329*35ffd701SAndroid Build Coastguard Worker         //
330*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->StateDx9ConstantBuffer);
331*35ffd701SAndroid Build Coastguard Worker     }
332*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Gpu.Overlay)
333*35ffd701SAndroid Build Coastguard Worker     {
334*35ffd701SAndroid Build Coastguard Worker         // Overlay buffer use Async Flip values
335*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->Overlay);
336*35ffd701SAndroid Build Coastguard Worker 
337*35ffd701SAndroid Build Coastguard Worker         if((pTexInfo->Format == GMM_FORMAT_YUY2) && (pTexInfo->BaseWidth == 640))
338*35ffd701SAndroid Build Coastguard Worker         {
339*35ffd701SAndroid Build Coastguard Worker             // override the pitch alignment
340*35ffd701SAndroid Build Coastguard Worker             pBuff->PitchAlignment = 64;
341*35ffd701SAndroid Build Coastguard Worker         }
342*35ffd701SAndroid Build Coastguard Worker     }
343*35ffd701SAndroid Build Coastguard Worker     if(pTexInfo->Flags.Info.XAdapter)
344*35ffd701SAndroid Build Coastguard Worker     {
345*35ffd701SAndroid Build Coastguard Worker         //Add Cross Adapter resource restriction for hybrid graphics.
346*35ffd701SAndroid Build Coastguard Worker         pBuff = GetBestRestrictions(pBuff, &pPlatformResource->XAdapter);
347*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Type == RESOURCE_BUFFER)
348*35ffd701SAndroid Build Coastguard Worker         {
349*35ffd701SAndroid Build Coastguard Worker             pBuff->MaxWidth  = pPlatformResource->SurfaceMaxSize;
350*35ffd701SAndroid Build Coastguard Worker             pBuff->MaxPitch  = pPlatformResource->BufferType.MaxPitch;
351*35ffd701SAndroid Build Coastguard Worker             pBuff->MaxHeight = 1;
352*35ffd701SAndroid Build Coastguard Worker         }
353*35ffd701SAndroid Build Coastguard Worker     }
354*35ffd701SAndroid Build Coastguard Worker 
355*35ffd701SAndroid Build Coastguard Worker     //Non Aligned ExistingSysMem  Special cases.
356*35ffd701SAndroid Build Coastguard Worker     if((pTexInfo->Flags.Info.ExistingSysMem &&
357*35ffd701SAndroid Build Coastguard Worker         (!pTexInfo->ExistingSysMem.IsGmmAllocated) &&
358*35ffd701SAndroid Build Coastguard Worker         (!pTexInfo->ExistingSysMem.IsPageAligned)))
359*35ffd701SAndroid Build Coastguard Worker     {
360*35ffd701SAndroid Build Coastguard Worker 
361*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.Linear ||
362*35ffd701SAndroid Build Coastguard Worker            pTexInfo->Flags.Info.SVM)
363*35ffd701SAndroid Build Coastguard Worker         {
364*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Type == RESOURCE_BUFFER)
365*35ffd701SAndroid Build Coastguard Worker             {
366*35ffd701SAndroid Build Coastguard Worker                 //Use combination of BufferType, NoRestriction to support large buffer with minimal pitch alignment
367*35ffd701SAndroid Build Coastguard Worker                 *pBuff                      = pPlatformResource->BufferType;
368*35ffd701SAndroid Build Coastguard Worker                 pBuff->PitchAlignment       = pPlatformResource->NoRestriction.PitchAlignment;
369*35ffd701SAndroid Build Coastguard Worker                 pBuff->LockPitchAlignment   = pPlatformResource->NoRestriction.LockPitchAlignment;
370*35ffd701SAndroid Build Coastguard Worker                 pBuff->RenderPitchAlignment = pPlatformResource->NoRestriction.LockPitchAlignment;
371*35ffd701SAndroid Build Coastguard Worker                 pBuff->MinPitch             = pPlatformResource->NoRestriction.MinPitch;
372*35ffd701SAndroid Build Coastguard Worker             }
373*35ffd701SAndroid Build Coastguard Worker 
374*35ffd701SAndroid Build Coastguard Worker             //[To DO] Handle other types when needed!
375*35ffd701SAndroid Build Coastguard Worker         }
376*35ffd701SAndroid Build Coastguard Worker         /*
377*35ffd701SAndroid Build Coastguard Worker         else if(Surf.Flags.Gpu.Texture)
378*35ffd701SAndroid Build Coastguard Worker         {
379*35ffd701SAndroid Build Coastguard Worker             //Override as and when required
380*35ffd701SAndroid Build Coastguard Worker         }
381*35ffd701SAndroid Build Coastguard Worker         else if(Surf.Flags.Gpu.RenderTarget)
382*35ffd701SAndroid Build Coastguard Worker         {
383*35ffd701SAndroid Build Coastguard Worker             //Overide as and when Required
384*35ffd701SAndroid Build Coastguard Worker         }*/
385*35ffd701SAndroid Build Coastguard Worker     }
386*35ffd701SAndroid Build Coastguard Worker 
387*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
388*35ffd701SAndroid Build Coastguard Worker }
389*35ffd701SAndroid Build Coastguard Worker 
390*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
391*35ffd701SAndroid Build Coastguard Worker /// Internal function resets the restrictions and puts the allocation in invalid state
392*35ffd701SAndroid Build Coastguard Worker ///
393*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
394*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: reset the restrictions to invalid state.
395*35ffd701SAndroid Build Coastguard Worker ///
396*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
ResetRestrictions(__GMM_BUFFER_TYPE * pRestriction)397*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::ResetRestrictions(__GMM_BUFFER_TYPE *pRestriction)
398*35ffd701SAndroid Build Coastguard Worker {
399*35ffd701SAndroid Build Coastguard Worker     pRestriction->MinDepth = 0xffffffff;
400*35ffd701SAndroid Build Coastguard Worker }
401*35ffd701SAndroid Build Coastguard Worker 
402*35ffd701SAndroid Build Coastguard Worker 
403*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
404*35ffd701SAndroid Build Coastguard Worker /// Internal function returns the best restrictions depending on how the surface may
405*35ffd701SAndroid Build Coastguard Worker /// possibly be used.
406*35ffd701SAndroid Build Coastguard Worker ///
407*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pTexInfo: ptr to ::GMM_TEXTURE_INFO,
408*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pRestrictions: Reference to surface alignment and size restrictions
409*35ffd701SAndroid Build Coastguard Worker ///
410*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetTexRestrictions(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pRestrictions)411*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::GetTexRestrictions(GMM_TEXTURE_INFO * pTexInfo,
412*35ffd701SAndroid Build Coastguard Worker                                                 __GMM_BUFFER_TYPE *pRestrictions)
413*35ffd701SAndroid Build Coastguard Worker {
414*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
415*35ffd701SAndroid Build Coastguard Worker 
416*35ffd701SAndroid Build Coastguard Worker     GetResRestrictions(pTexInfo, *pRestrictions);
417*35ffd701SAndroid Build Coastguard Worker 
418*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
419*35ffd701SAndroid Build Coastguard Worker }
420*35ffd701SAndroid Build Coastguard Worker 
421*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
422*35ffd701SAndroid Build Coastguard Worker /// Returns the restrictions that a particular resource must follow on a particular
423*35ffd701SAndroid Build Coastguard Worker /// OS or hardware.
424*35ffd701SAndroid Build Coastguard Worker ///
425*35ffd701SAndroid Build Coastguard Worker /// @param[out]  Restrictions: restrictions that this resource must adhere to
426*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetResRestrictions(GMM_TEXTURE_INFO * pTexinfo,__GMM_BUFFER_TYPE & Restrictions)427*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmTextureCalc::GetResRestrictions(GMM_TEXTURE_INFO * pTexinfo,
428*35ffd701SAndroid Build Coastguard Worker                                                 __GMM_BUFFER_TYPE &Restrictions)
429*35ffd701SAndroid Build Coastguard Worker {
430*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
431*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = NULL;
432*35ffd701SAndroid Build Coastguard Worker     GMM_RESOURCE_FLAG        ZeroGpuFlags;
433*35ffd701SAndroid Build Coastguard Worker 
434*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pGmmLibContext, VOIDRETURN);
435*35ffd701SAndroid Build Coastguard Worker 
436*35ffd701SAndroid Build Coastguard Worker     pPlatform = GMM_OVERRIDE_PLATFORM_INFO(pTexinfo, pGmmLibContext);
437*35ffd701SAndroid Build Coastguard Worker 
438*35ffd701SAndroid Build Coastguard Worker     // Check that at least one usage flag is set for allocations other than
439*35ffd701SAndroid Build Coastguard Worker     // Primary/Shadow/Staging.
440*35ffd701SAndroid Build Coastguard Worker     memset(&ZeroGpuFlags.Gpu, 0, sizeof(ZeroGpuFlags.Gpu));
441*35ffd701SAndroid Build Coastguard Worker     if((pTexinfo->Type <= RESOURCE_KMD_CHECK_START ||
442*35ffd701SAndroid Build Coastguard Worker         pTexinfo->Type >= RESOURCE_KMD_CHECK_END) &&
443*35ffd701SAndroid Build Coastguard Worker        !memcmp(&pTexinfo->Flags.Gpu, &ZeroGpuFlags.Gpu, sizeof(ZeroGpuFlags.Gpu)))
444*35ffd701SAndroid Build Coastguard Worker     {
445*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "No GPU Usage specified!");
446*35ffd701SAndroid Build Coastguard Worker         return;
447*35ffd701SAndroid Build Coastguard Worker     }
448*35ffd701SAndroid Build Coastguard Worker 
449*35ffd701SAndroid Build Coastguard Worker     ResetRestrictions(&Restrictions); //Set to Default
450*35ffd701SAndroid Build Coastguard Worker 
451*35ffd701SAndroid Build Coastguard Worker     // Get worst case restrictions that match GPU flags set in resource
452*35ffd701SAndroid Build Coastguard Worker     switch(pTexinfo->Type)
453*35ffd701SAndroid Build Coastguard Worker     {
454*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_1D:
455*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_2D:
456*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_3D:
457*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_CUBE:
458*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_BUFFER:
459*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_SCRATCH:
460*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GDI:
461*35ffd701SAndroid Build Coastguard Worker             GetGenericRestrictions(pTexinfo, &Restrictions);
462*35ffd701SAndroid Build Coastguard Worker             break;
463*35ffd701SAndroid Build Coastguard Worker 
464*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_HW_CONTEXT:
465*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_TAG_PAGE:
466*35ffd701SAndroid Build Coastguard Worker             if(pTexinfo->Flags.Info.TiledW ||
467*35ffd701SAndroid Build Coastguard Worker                pTexinfo->Flags.Info.TiledX ||
468*35ffd701SAndroid Build Coastguard Worker                GMM_IS_4KB_TILE(pTexinfo->Flags))
469*35ffd701SAndroid Build Coastguard Worker             {
470*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Tiled Pref specified for RESOURCE_LINEAR!");
471*35ffd701SAndroid Build Coastguard Worker                 return;
472*35ffd701SAndroid Build Coastguard Worker             }
473*35ffd701SAndroid Build Coastguard Worker             GetLinearRestrictions(pTexinfo, &Restrictions);
474*35ffd701SAndroid Build Coastguard Worker             break;
475*35ffd701SAndroid Build Coastguard Worker 
476*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PRIMARY:
477*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_SHADOW:
478*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_STAGING:
479*35ffd701SAndroid Build Coastguard Worker             GetPrimaryRestrictions(pTexinfo, &Restrictions);
480*35ffd701SAndroid Build Coastguard Worker             break;
481*35ffd701SAndroid Build Coastguard Worker 
482*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_NNDI:
483*35ffd701SAndroid Build Coastguard Worker             Restrictions = pPlatform->Nndi;
484*35ffd701SAndroid Build Coastguard Worker             break;
485*35ffd701SAndroid Build Coastguard Worker 
486*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_HARDWARE_MBM:
487*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_IFFS_MAPTOGTT:
488*35ffd701SAndroid Build Coastguard Worker             //Hardware MBM resource request can come for overlay allocation or normal
489*35ffd701SAndroid Build Coastguard Worker             //displayable allocation. So get the restrictions accordingly
490*35ffd701SAndroid Build Coastguard Worker             if(pTexinfo->Flags.Gpu.Overlay)
491*35ffd701SAndroid Build Coastguard Worker             {
492*35ffd701SAndroid Build Coastguard Worker                 Restrictions = pPlatform->Overlay;
493*35ffd701SAndroid Build Coastguard Worker             }
494*35ffd701SAndroid Build Coastguard Worker             else
495*35ffd701SAndroid Build Coastguard Worker             {
496*35ffd701SAndroid Build Coastguard Worker                 Restrictions = pPlatform->HardwareMBM;
497*35ffd701SAndroid Build Coastguard Worker             }
498*35ffd701SAndroid Build Coastguard Worker             break;
499*35ffd701SAndroid Build Coastguard Worker 
500*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_CURSOR:
501*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PWR_CONTEXT:
502*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_KMD_BUFFER:
503*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_NULL_CONTEXT_INDIRECT_STATE:
504*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PERF_DATA_QUEUE:
505*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GLOBAL_BUFFER:
506*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_FBC:
507*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GFX_CLIENT_BUFFER:
508*35ffd701SAndroid Build Coastguard Worker             Restrictions = pPlatform->Cursor;
509*35ffd701SAndroid Build Coastguard Worker             break;
510*35ffd701SAndroid Build Coastguard Worker 
511*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_OVERLAY_DMA:
512*35ffd701SAndroid Build Coastguard Worker             Restrictions = pPlatform->NoRestriction;
513*35ffd701SAndroid Build Coastguard Worker             break;
514*35ffd701SAndroid Build Coastguard Worker 
515*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GTT_TRANSFER_REGION:
516*35ffd701SAndroid Build Coastguard Worker             GetGenericRestrictions(pTexinfo, &Restrictions);
517*35ffd701SAndroid Build Coastguard Worker             break;
518*35ffd701SAndroid Build Coastguard Worker 
519*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_OVERLAY_INTERMEDIATE_SURFACE:
520*35ffd701SAndroid Build Coastguard Worker             Restrictions = pPlatform->Overlay;
521*35ffd701SAndroid Build Coastguard Worker             break;
522*35ffd701SAndroid Build Coastguard Worker 
523*35ffd701SAndroid Build Coastguard Worker         default:
524*35ffd701SAndroid Build Coastguard Worker             GetGenericRestrictions(pTexinfo, &Restrictions);
525*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Unkown Resource type");
526*35ffd701SAndroid Build Coastguard Worker     }
527*35ffd701SAndroid Build Coastguard Worker     // Apply any specific WA
528*35ffd701SAndroid Build Coastguard Worker 
529*35ffd701SAndroid Build Coastguard Worker     if(((pTexinfo->Flags.Wa.ILKNeedAvcMprRowStore32KAlign)) ||
530*35ffd701SAndroid Build Coastguard Worker        ((pTexinfo->Flags.Wa.ILKNeedAvcDmvBuffer32KAlign)))
531*35ffd701SAndroid Build Coastguard Worker     {
532*35ffd701SAndroid Build Coastguard Worker         Restrictions.Alignment = GFX_ALIGN(Restrictions.Alignment, GMM_KBYTE(32));
533*35ffd701SAndroid Build Coastguard Worker     }
534*35ffd701SAndroid Build Coastguard Worker 
535*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetWaTable().WaAlignContextImage && (pTexinfo->Type == RESOURCE_HW_CONTEXT))
536*35ffd701SAndroid Build Coastguard Worker     {
537*35ffd701SAndroid Build Coastguard Worker         Restrictions.Alignment = GFX_ALIGN(Restrictions.Alignment, GMM_KBYTE(64));
538*35ffd701SAndroid Build Coastguard Worker     }
539*35ffd701SAndroid Build Coastguard Worker 
540*35ffd701SAndroid Build Coastguard Worker     if(pTexinfo->Flags.Gpu.S3d &&
541*35ffd701SAndroid Build Coastguard Worker        pTexinfo->Flags.Info.Linear &&
542*35ffd701SAndroid Build Coastguard Worker        !pGmmLibContext->GetSkuTable().FtrDisplayEngineS3d)
543*35ffd701SAndroid Build Coastguard Worker     {
544*35ffd701SAndroid Build Coastguard Worker         Restrictions.Alignment      = PAGE_SIZE;
545*35ffd701SAndroid Build Coastguard Worker         Restrictions.PitchAlignment = PAGE_SIZE;
546*35ffd701SAndroid Build Coastguard Worker     }
547*35ffd701SAndroid Build Coastguard Worker 
548*35ffd701SAndroid Build Coastguard Worker     if(pTexinfo->Flags.Gpu.TiledResource)
549*35ffd701SAndroid Build Coastguard Worker     {
550*35ffd701SAndroid Build Coastguard Worker         // Need at least 64KB alignment to track tile mappings (h/w or s/w tracking).
551*35ffd701SAndroid Build Coastguard Worker         Restrictions.Alignment = GFX_ALIGN(Restrictions.Alignment, GMM_KBYTE(64));
552*35ffd701SAndroid Build Coastguard Worker 
553*35ffd701SAndroid Build Coastguard Worker         // Buffer tiled resources are trivially divided into 64KB tiles => Pitch must divide into 64KB tiles
554*35ffd701SAndroid Build Coastguard Worker         if(pTexinfo->Type == RESOURCE_BUFFER)
555*35ffd701SAndroid Build Coastguard Worker         {
556*35ffd701SAndroid Build Coastguard Worker             Restrictions.PitchAlignment = GFX_ALIGN(Restrictions.PitchAlignment, GMM_KBYTE(64));
557*35ffd701SAndroid Build Coastguard Worker         }
558*35ffd701SAndroid Build Coastguard Worker 
559*35ffd701SAndroid Build Coastguard Worker     }
560*35ffd701SAndroid Build Coastguard Worker 
561*35ffd701SAndroid Build Coastguard Worker     // SKL TileY Display needs 1MB alignment.
562*35ffd701SAndroid Build Coastguard Worker     if(((pTexinfo->Type == RESOURCE_PRIMARY) ||
563*35ffd701SAndroid Build Coastguard Worker         pTexinfo->Flags.Gpu.FlipChain) &&
564*35ffd701SAndroid Build Coastguard Worker        (GMM_IS_4KB_TILE(pTexinfo->Flags) ||
565*35ffd701SAndroid Build Coastguard Worker         pTexinfo->Flags.Info.TiledYf))
566*35ffd701SAndroid Build Coastguard Worker     {
567*35ffd701SAndroid Build Coastguard Worker         Restrictions.Alignment = GMM_MBYTE(1);
568*35ffd701SAndroid Build Coastguard Worker     }
569*35ffd701SAndroid Build Coastguard Worker 
570*35ffd701SAndroid Build Coastguard Worker     if(pTexinfo->Flags.Info.RenderCompressed ||
571*35ffd701SAndroid Build Coastguard Worker         pTexinfo->Flags.Info.MediaCompressed || (pGmmLibContext->GetSkuTable().FtrXe2Compression && !pTexinfo->Flags.Info.NotCompressed))
572*35ffd701SAndroid Build Coastguard Worker     {
573*35ffd701SAndroid Build Coastguard Worker         if(pGmmLibContext->GetSkuTable().FtrFlatPhysCCS)
574*35ffd701SAndroid Build Coastguard Worker         {
575*35ffd701SAndroid Build Coastguard Worker             Restrictions.Alignment = pGmmLibContext->GetSkuTable().FtrXe2Compression ? GFX_ALIGN(Restrictions.Alignment, GMM_BYTES(256)) : GFX_ALIGN(Restrictions.Alignment, GMM_BYTES(128));
576*35ffd701SAndroid Build Coastguard Worker         }
577*35ffd701SAndroid Build Coastguard Worker         else // only for platforms having auxtable
578*35ffd701SAndroid Build Coastguard Worker         {
579*35ffd701SAndroid Build Coastguard Worker             Restrictions.Alignment = GFX_ALIGN(Restrictions.Alignment, (WA16K(pGmmLibContext) ? GMM_KBYTE(16) : WA64K(pGmmLibContext) ? GMM_KBYTE(64) : GMM_MBYTE(1)));
580*35ffd701SAndroid Build Coastguard Worker 	    }
581*35ffd701SAndroid Build Coastguard Worker     }
582*35ffd701SAndroid Build Coastguard Worker 
583*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
584*35ffd701SAndroid Build Coastguard Worker }
585*35ffd701SAndroid Build Coastguard Worker 
586*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
587*35ffd701SAndroid Build Coastguard Worker /// Calculates surface size based on Non Aligned ExistingSysMem restrictions.
588*35ffd701SAndroid Build Coastguard Worker ///
589*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
590*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
ApplyExistingSysMemRestrictions()591*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmResourceInfoCommon::ApplyExistingSysMemRestrictions()
592*35ffd701SAndroid Build Coastguard Worker {
593*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
594*35ffd701SAndroid Build Coastguard Worker 
595*35ffd701SAndroid Build Coastguard Worker     // Handle Minimal Restriction ExistingSysMem Requirements...
596*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    AdditionalPaddingBytes = 0;
597*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    AdditionalPaddingRows  = 0;
598*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    BaseAlignment          = 1; // 1 = Byte Alignment
599*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    EndAlignment           = 1; // 1 = Byte Alignment
600*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    SizePadding            = 1; // 1 = Byte Padding
601*35ffd701SAndroid Build Coastguard Worker     uint32_t          CompressHeight, CompressWidth, CompressDepth;
602*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    Width, Height;
603*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_INFO *pTexInfo = &Surf;
604*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
605*35ffd701SAndroid Build Coastguard Worker 
606*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
607*35ffd701SAndroid Build Coastguard Worker 
608*35ffd701SAndroid Build Coastguard Worker     pPlatform    = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo, GetGmmLibContext());
609*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(pTexInfo, GetGmmLibContext());
610*35ffd701SAndroid Build Coastguard Worker 
611*35ffd701SAndroid Build Coastguard Worker     Height = pTexInfo->BaseHeight;
612*35ffd701SAndroid Build Coastguard Worker     Width  = pTexInfo->BaseWidth;
613*35ffd701SAndroid Build Coastguard Worker 
614*35ffd701SAndroid Build Coastguard Worker #define UPDATE_BASE_ALIGNMENT(a)                                                                                                              \
615*35ffd701SAndroid Build Coastguard Worker     {                                                                                                                                         \
616*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((GFX_MAX(BaseAlignment, a) % GFX_MIN(BaseAlignment, a)) == 0); /* Revisit if ever have to support complex alignments. */ \
617*35ffd701SAndroid Build Coastguard Worker         BaseAlignment = GFX_MAX(BaseAlignment, a);                                                                                            \
618*35ffd701SAndroid Build Coastguard Worker     }
619*35ffd701SAndroid Build Coastguard Worker 
620*35ffd701SAndroid Build Coastguard Worker #define UPDATE_PADDING(p)                      \
621*35ffd701SAndroid Build Coastguard Worker     {                                          \
622*35ffd701SAndroid Build Coastguard Worker         SizePadding = GFX_MAX(SizePadding, p); \
623*35ffd701SAndroid Build Coastguard Worker     }
624*35ffd701SAndroid Build Coastguard Worker 
625*35ffd701SAndroid Build Coastguard Worker #define UPDATE_ADDITIONAL_ROWS(r)                                  \
626*35ffd701SAndroid Build Coastguard Worker     {                                                              \
627*35ffd701SAndroid Build Coastguard Worker         AdditionalPaddingRows = GFX_MAX(AdditionalPaddingRows, r); \
628*35ffd701SAndroid Build Coastguard Worker     }
629*35ffd701SAndroid Build Coastguard Worker 
630*35ffd701SAndroid Build Coastguard Worker #define UPDATE_ADDITIONAL_BYTES(b)                                   \
631*35ffd701SAndroid Build Coastguard Worker     {                                                                \
632*35ffd701SAndroid Build Coastguard Worker         AdditionalPaddingBytes = GFX_MAX(AdditionalPaddingBytes, b); \
633*35ffd701SAndroid Build Coastguard Worker     }
634*35ffd701SAndroid Build Coastguard Worker 
635*35ffd701SAndroid Build Coastguard Worker #define UPDATE_END_ALIGNMENT(a)                                                                                                             \
636*35ffd701SAndroid Build Coastguard Worker     {                                                                                                                                       \
637*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((GFX_MAX(EndAlignment, a) % GFX_MIN(EndAlignment, a)) == 0); /* Revisit if ever have to support complex alignments. */ \
638*35ffd701SAndroid Build Coastguard Worker         EndAlignment = GFX_MAX(EndAlignment, a);                                                                                            \
639*35ffd701SAndroid Build Coastguard Worker     }
640*35ffd701SAndroid Build Coastguard Worker 
641*35ffd701SAndroid Build Coastguard Worker 
642*35ffd701SAndroid Build Coastguard Worker     if(!pTexInfo->Pitch)
643*35ffd701SAndroid Build Coastguard Worker     {
644*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(pTexInfo->Type == RESOURCE_1D); // Clients can leave pitch zero for 1D, and we'll fill-in...
645*35ffd701SAndroid Build Coastguard Worker         pTexInfo->Pitch = Width * (pTexInfo->BitsPerPixel >> 3);
646*35ffd701SAndroid Build Coastguard Worker     }
647*35ffd701SAndroid Build Coastguard Worker 
648*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT( // Currently limiting our support...
649*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Gpu.NoRestriction ||
650*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Gpu.Index ||
651*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Gpu.RenderTarget ||
652*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Gpu.Texture ||
653*35ffd701SAndroid Build Coastguard Worker     pTexInfo->Flags.Gpu.Vertex);
654*35ffd701SAndroid Build Coastguard Worker 
655*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT( // Trivial, Linear Surface...
656*35ffd701SAndroid Build Coastguard Worker     ((pTexInfo->Type == RESOURCE_BUFFER) || (pTexInfo->Type == RESOURCE_1D) || (pTexInfo->Type == RESOURCE_2D)) &&
657*35ffd701SAndroid Build Coastguard Worker     (pTexInfo->MaxLod == 0) &&
658*35ffd701SAndroid Build Coastguard Worker     !GMM_IS_TILED(pPlatform->TileInfo[pTexInfo->TileMode]) &&
659*35ffd701SAndroid Build Coastguard Worker     !GmmIsPlanar(pTexInfo->Format) &&
660*35ffd701SAndroid Build Coastguard Worker     ((pTexInfo->ArraySize <= 1) || (pTexInfo->Type == RESOURCE_BUFFER)));
661*35ffd701SAndroid Build Coastguard Worker 
662*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT( // Valid Surface...
663*35ffd701SAndroid Build Coastguard Worker     (Width > 0) &&
664*35ffd701SAndroid Build Coastguard Worker     !((pTexInfo->Type == RESOURCE_BUFFER) && GmmIsYUVPacked(pTexInfo->Format)));
665*35ffd701SAndroid Build Coastguard Worker 
666*35ffd701SAndroid Build Coastguard Worker     // Convert to compression blocks, if applicable...
667*35ffd701SAndroid Build Coastguard Worker     if(GmmIsCompressed(GetGmmLibContext(), pTexInfo->Format))
668*35ffd701SAndroid Build Coastguard Worker      {
669*35ffd701SAndroid Build Coastguard Worker         pTextureCalc->GetCompressionBlockDimensions(pTexInfo->Format, &CompressWidth, &CompressHeight, &CompressDepth);
670*35ffd701SAndroid Build Coastguard Worker 
671*35ffd701SAndroid Build Coastguard Worker         Width  = GFX_CEIL_DIV(Width, CompressWidth);
672*35ffd701SAndroid Build Coastguard Worker         Height = GFX_CEIL_DIV(Height, CompressHeight);
673*35ffd701SAndroid Build Coastguard Worker     }
674*35ffd701SAndroid Build Coastguard Worker 
675*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT( // Valid Surface Follow-Up...
676*35ffd701SAndroid Build Coastguard Worker     (pTexInfo->Pitch >= (Width * (pTexInfo->BitsPerPixel >> 3))));
677*35ffd701SAndroid Build Coastguard Worker 
678*35ffd701SAndroid Build Coastguard Worker     if(!pTexInfo->Flags.Gpu.NoRestriction && !pTexInfo->Flags.Info.SVM && !pTexInfo->Flags.Info.Linear)
679*35ffd701SAndroid Build Coastguard Worker     {
680*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.Index) /////////////////////////////////////////////////////////
681*35ffd701SAndroid Build Coastguard Worker         {
682*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(!(
683*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.RenderTarget ||
684*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.Texture ||
685*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.Vertex)); // Can explore if needed what combo's make sense--and how req's should combine.
686*35ffd701SAndroid Build Coastguard Worker 
687*35ffd701SAndroid Build Coastguard Worker             // 3DSTATE_INDEX_BUFFER...
688*35ffd701SAndroid Build Coastguard Worker             UPDATE_BASE_ALIGNMENT(4); // 32-bit worst-case, since GMM doesn't receive element-size from clients.
689*35ffd701SAndroid Build Coastguard Worker             if(GetGmmLibContext()->GetWaTable().WaAlignIndexBuffer)
690*35ffd701SAndroid Build Coastguard Worker             {
691*35ffd701SAndroid Build Coastguard Worker                 UPDATE_END_ALIGNMENT(64);
692*35ffd701SAndroid Build Coastguard Worker             }
693*35ffd701SAndroid Build Coastguard Worker             else
694*35ffd701SAndroid Build Coastguard Worker             {
695*35ffd701SAndroid Build Coastguard Worker                 UPDATE_END_ALIGNMENT(1);
696*35ffd701SAndroid Build Coastguard Worker             }
697*35ffd701SAndroid Build Coastguard Worker         }
698*35ffd701SAndroid Build Coastguard Worker 
699*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.Vertex) ////////////////////////////////////////////////////////
700*35ffd701SAndroid Build Coastguard Worker         {
701*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(!(
702*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.Index ||
703*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.RenderTarget ||
704*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Flags.Gpu.Texture)); // Can explore if needed what combo's make sense--and how req's should combine.
705*35ffd701SAndroid Build Coastguard Worker 
706*35ffd701SAndroid Build Coastguard Worker             // VERTEX_BUFFER_STATE...
707*35ffd701SAndroid Build Coastguard Worker             UPDATE_BASE_ALIGNMENT(1); // VB's have member alignment requirements--but it's up to UMD to enforce.
708*35ffd701SAndroid Build Coastguard Worker             UPDATE_PADDING(1);
709*35ffd701SAndroid Build Coastguard Worker         }
710*35ffd701SAndroid Build Coastguard Worker 
711*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.RenderTarget) //////////////////////////////////////////////////
712*35ffd701SAndroid Build Coastguard Worker         {
713*35ffd701SAndroid Build Coastguard Worker             uint32_t ElementSize;
714*35ffd701SAndroid Build Coastguard Worker 
715*35ffd701SAndroid Build Coastguard Worker             // SURFACE_STATE...
716*35ffd701SAndroid Build Coastguard Worker             ElementSize = (pTexInfo->BitsPerPixel >> 3) * (GmmIsYUVPacked(pTexInfo->Format) ? 2 : 1);
717*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT((pTexInfo->Pitch % ElementSize) == 0);
718*35ffd701SAndroid Build Coastguard Worker             UPDATE_BASE_ALIGNMENT(ElementSize);
719*35ffd701SAndroid Build Coastguard Worker             UPDATE_PADDING(pTexInfo->Pitch * 2); // "Surface Padding Requirements --> Render Target and Media Surfaces"
720*35ffd701SAndroid Build Coastguard Worker         }
721*35ffd701SAndroid Build Coastguard Worker 
722*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Gpu.Texture) // (i.e. Sampler Surfaces) ///////////////////////////
723*35ffd701SAndroid Build Coastguard Worker         {
724*35ffd701SAndroid Build Coastguard Worker             UPDATE_BASE_ALIGNMENT(1); // Sampler supports byte alignment (with performance hit if misaligned).
725*35ffd701SAndroid Build Coastguard Worker 
726*35ffd701SAndroid Build Coastguard Worker             if(GetGmmLibContext()->GetWaTable().WaNoMinimizedTrivialSurfacePadding)
727*35ffd701SAndroid Build Coastguard Worker             {
728*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->Type == RESOURCE_BUFFER)
729*35ffd701SAndroid Build Coastguard Worker                 {
730*35ffd701SAndroid Build Coastguard Worker                     if(GetGmmLibContext()->GetWaTable().WaNoBufferSamplerPadding)
731*35ffd701SAndroid Build Coastguard Worker                      {
732*35ffd701SAndroid Build Coastguard Worker                         // Client agreeing to take responsibility for flushing L3 after sampling/etc.
733*35ffd701SAndroid Build Coastguard Worker                     }
734*35ffd701SAndroid Build Coastguard Worker                     else
735*35ffd701SAndroid Build Coastguard Worker                     {
736*35ffd701SAndroid Build Coastguard Worker                         // GMM currently receives GENERIC_8BIT for
737*35ffd701SAndroid Build Coastguard Worker                         // RESOURCE_BUFFER creations, so we have to assume the
738*35ffd701SAndroid Build Coastguard Worker                         // worst-case sample size of 128-bit (unless we alter
739*35ffd701SAndroid Build Coastguard Worker                         // our interface meaning):
740*35ffd701SAndroid Build Coastguard Worker                         uint32_t ElementSize = 16;
741*35ffd701SAndroid Build Coastguard Worker 
742*35ffd701SAndroid Build Coastguard Worker                         // "Surface Padding Requirements --> Sampling Engine Surfaces"
743*35ffd701SAndroid Build Coastguard Worker                         UPDATE_PADDING(ElementSize * ((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) == IGFX_GEN8_CORE) ? 512 : 256));
744*35ffd701SAndroid Build Coastguard Worker                         UPDATE_ADDITIONAL_BYTES(16);
745*35ffd701SAndroid Build Coastguard Worker                     }
746*35ffd701SAndroid Build Coastguard Worker                 }
747*35ffd701SAndroid Build Coastguard Worker                 else // RESOURCE_1D/2D...
748*35ffd701SAndroid Build Coastguard Worker                 {
749*35ffd701SAndroid Build Coastguard Worker                     /* Sampler needs Alignment Unit padding--
750*35ffd701SAndroid Build Coastguard Worker                         but sampler arch confirms that's overly conservative
751*35ffd701SAndroid Build Coastguard Worker                         padding--and for trivial (linear, single-subresource)
752*35ffd701SAndroid Build Coastguard Worker                         2D's, even-row (quad-row on BDW.A0) plus additional
753*35ffd701SAndroid Build Coastguard Worker                         64B padding is sufficient. (E.g. pitch overfetch will
754*35ffd701SAndroid Build Coastguard Worker                         be caught by subsequent rows or the additional 64B. */
755*35ffd701SAndroid Build Coastguard Worker 
756*35ffd701SAndroid Build Coastguard Worker                     __GMM_ASSERT((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) <= IGFX_GEN8_CORE));
757*35ffd701SAndroid Build Coastguard Worker 
758*35ffd701SAndroid Build Coastguard Worker                     if(GmmIsCompressed(GetGmmLibContext(), pTexInfo->Format))
759*35ffd701SAndroid Build Coastguard Worker                     {
760*35ffd701SAndroid Build Coastguard Worker                         // "For compressed textures...padding at the bottom of the surface is to an even compressed row."
761*35ffd701SAndroid Build Coastguard Worker                         UPDATE_PADDING(pTexInfo->Pitch * 2); // (Sampler arch confirmed that even-row is sufficient on BDW despite BDW's 4x4 sampling, since this req is from L2 instead of L1.)
762*35ffd701SAndroid Build Coastguard Worker                     }
763*35ffd701SAndroid Build Coastguard Worker                     else
764*35ffd701SAndroid Build Coastguard Worker                     {
765*35ffd701SAndroid Build Coastguard Worker                         UPDATE_PADDING(pTexInfo->Pitch * ((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) == IGFX_GEN8_CORE) ? 4 : 2)); // Sampler Fetch Rows: BDW ? 4 : 2
766*35ffd701SAndroid Build Coastguard Worker                     }
767*35ffd701SAndroid Build Coastguard Worker 
768*35ffd701SAndroid Build Coastguard Worker                     // "For packed YUV, 96 bpt, 48 bpt, and 24 bpt surface formats, additional padding is required."
769*35ffd701SAndroid Build Coastguard Worker                     if(GmmIsYUVPacked(pTexInfo->Format) || (pTexInfo->BitsPerPixel == 96) || (pTexInfo->BitsPerPixel == 48) || (pTexInfo->BitsPerPixel == 24))
770*35ffd701SAndroid Build Coastguard Worker                     {
771*35ffd701SAndroid Build Coastguard Worker                         UPDATE_ADDITIONAL_BYTES(16);
772*35ffd701SAndroid Build Coastguard Worker                         UPDATE_ADDITIONAL_ROWS(1);
773*35ffd701SAndroid Build Coastguard Worker                     }
774*35ffd701SAndroid Build Coastguard Worker 
775*35ffd701SAndroid Build Coastguard Worker                     /* "For linear surfaces, additional padding of 64
776*35ffd701SAndroid Build Coastguard Worker                         bytes is required at the bottom of the surface."
777*35ffd701SAndroid Build Coastguard Worker                         (Sampler arch confirmed the 64 bytes can overlap with
778*35ffd701SAndroid Build Coastguard Worker                         the other "additional 16 bytes" mentions in that section.) */
779*35ffd701SAndroid Build Coastguard Worker                     UPDATE_ADDITIONAL_BYTES(64);
780*35ffd701SAndroid Build Coastguard Worker                 }
781*35ffd701SAndroid Build Coastguard Worker             }
782*35ffd701SAndroid Build Coastguard Worker             else
783*35ffd701SAndroid Build Coastguard Worker             {
784*35ffd701SAndroid Build Coastguard Worker                 /* For SURFTYPE_BUFFER, SURFTYPE_1D, and
785*35ffd701SAndroid Build Coastguard Worker                     SURFTYPE_2D non-array, non-MSAA, non-mip-mapped surfaces in
786*35ffd701SAndroid Build Coastguard Worker                     linear memory, the only padding requirement is to the next
787*35ffd701SAndroid Build Coastguard Worker                     aligned 64-byte boundary beyond the end of the surface. */
788*35ffd701SAndroid Build Coastguard Worker                 UPDATE_END_ALIGNMENT(64);
789*35ffd701SAndroid Build Coastguard Worker             }
790*35ffd701SAndroid Build Coastguard Worker         }
791*35ffd701SAndroid Build Coastguard Worker     }
792*35ffd701SAndroid Build Coastguard Worker     else // Gpu.NoRestriction...
793*35ffd701SAndroid Build Coastguard Worker     {
794*35ffd701SAndroid Build Coastguard Worker         // Clients specify NoRestriction at their own risk--e.g. it can be
795*35ffd701SAndroid Build Coastguard Worker         // appropriate when using IA-Coherent L3 combined with L3 being in
796*35ffd701SAndroid Build Coastguard Worker         // unified/"Rest" mode (where there won't be write-->read-only
797*35ffd701SAndroid Build Coastguard Worker         // collisions on unintentionally shared cachelines).
798*35ffd701SAndroid Build Coastguard Worker     }
799*35ffd701SAndroid Build Coastguard Worker 
800*35ffd701SAndroid Build Coastguard Worker     { //Finally calculate surf size
801*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_SIZE_T OriginalEnd, RequiredSize;
802*35ffd701SAndroid Build Coastguard Worker 
803*35ffd701SAndroid Build Coastguard Worker         ExistingSysMem.pVirtAddress =
804*35ffd701SAndroid Build Coastguard Worker         (ExistingSysMem.pExistingSysMem & (PAGE_SIZE - 1)) ?
805*35ffd701SAndroid Build Coastguard Worker         ((uint64_t)GFX_ALIGN(ExistingSysMem.pExistingSysMem,
806*35ffd701SAndroid Build Coastguard Worker                              BaseAlignment)) :
807*35ffd701SAndroid Build Coastguard Worker         ExistingSysMem.pExistingSysMem;
808*35ffd701SAndroid Build Coastguard Worker 
809*35ffd701SAndroid Build Coastguard Worker         ExistingSysMem.pGfxAlignedVirtAddress =
810*35ffd701SAndroid Build Coastguard Worker         (uint64_t)GFX_ALIGN(
811*35ffd701SAndroid Build Coastguard Worker         (uint64_t)ExistingSysMem.pVirtAddress, PAGE_SIZE);
812*35ffd701SAndroid Build Coastguard Worker 
813*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((ExistingSysMem.pVirtAddress % BaseAlignment) == 0);
814*35ffd701SAndroid Build Coastguard Worker 
815*35ffd701SAndroid Build Coastguard Worker         RequiredSize = pTexInfo->Pitch * Height;
816*35ffd701SAndroid Build Coastguard Worker 
817*35ffd701SAndroid Build Coastguard Worker         RequiredSize =
818*35ffd701SAndroid Build Coastguard Worker         GFX_ALIGN(RequiredSize, SizePadding) +
819*35ffd701SAndroid Build Coastguard Worker         (AdditionalPaddingRows * pTexInfo->Pitch) +
820*35ffd701SAndroid Build Coastguard Worker         AdditionalPaddingBytes;
821*35ffd701SAndroid Build Coastguard Worker 
822*35ffd701SAndroid Build Coastguard Worker         OriginalEnd = ExistingSysMem.pVirtAddress + RequiredSize;
823*35ffd701SAndroid Build Coastguard Worker         RequiredSize += GFX_ALIGN(OriginalEnd, EndAlignment) - OriginalEnd;
824*35ffd701SAndroid Build Coastguard Worker 
825*35ffd701SAndroid Build Coastguard Worker         //Ensure sufficient ExistingSysMem available.
826*35ffd701SAndroid Build Coastguard Worker         if(ExistingSysMem.Size < RequiredSize)
827*35ffd701SAndroid Build Coastguard Worker         {
828*35ffd701SAndroid Build Coastguard Worker             return GMM_ERROR;
829*35ffd701SAndroid Build Coastguard Worker         }
830*35ffd701SAndroid Build Coastguard Worker 
831*35ffd701SAndroid Build Coastguard Worker         Surf.Size = RequiredSize;
832*35ffd701SAndroid Build Coastguard Worker     }
833*35ffd701SAndroid Build Coastguard Worker 
834*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
835*35ffd701SAndroid Build Coastguard Worker 
836*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
837*35ffd701SAndroid Build Coastguard Worker }
838