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