xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Resource/GmmResourceInfoCommon.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker 
23*35ffd701SAndroid Build Coastguard Worker 
24*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
25*35ffd701SAndroid Build Coastguard Worker 
26*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
27*35ffd701SAndroid Build Coastguard Worker /// Returns indication of whether resource is eligible for 64KB pages or not.
28*35ffd701SAndroid Build Coastguard Worker /// On Windows, UMD must call this api after GmmResCreate()
29*35ffd701SAndroid Build Coastguard Worker /// @return     1/0
30*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Is64KBPageSuitable()31*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::Is64KBPageSuitable()
32*35ffd701SAndroid Build Coastguard Worker {
33*35ffd701SAndroid Build Coastguard Worker     bool Ignore64KBPadding = false;
34*35ffd701SAndroid Build Coastguard Worker     //!!!! DO NOT USE GetSizeSurface() as it returns the padded size and not natural size.
35*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T Size = Surf.Size + AuxSurf.Size + AuxSecSurf.Size;
36*35ffd701SAndroid Build Coastguard Worker 
37*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(Size);
38*35ffd701SAndroid Build Coastguard Worker 
39*35ffd701SAndroid Build Coastguard Worker     // All ESM resources and VirtuaPadding are exempt from 64KB paging
40*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Info.ExistingSysMem ||
41*35ffd701SAndroid Build Coastguard Worker        Surf.Flags.Info.XAdapter ||
42*35ffd701SAndroid Build Coastguard Worker        Surf.Flags.Gpu.CameraCapture ||
43*35ffd701SAndroid Build Coastguard Worker        Surf.Flags.Info.KernelModeMapped ||
44*35ffd701SAndroid Build Coastguard Worker        (Surf.Flags.Gpu.S3d && !Surf.Flags.Gpu.S3dDx &&
45*35ffd701SAndroid Build Coastguard Worker         !GetGmmLibContext()->GetSkuTable().FtrDisplayEngineS3d)
46*35ffd701SAndroid Build Coastguard Worker #if(LHDM)
47*35ffd701SAndroid Build Coastguard Worker        || (Surf.Flags.Info.AllowVirtualPadding &&
48*35ffd701SAndroid Build Coastguard Worker            ExistingSysMem.hParentAllocation)
49*35ffd701SAndroid Build Coastguard Worker #endif
50*35ffd701SAndroid Build Coastguard Worker        )
51*35ffd701SAndroid Build Coastguard Worker     {
52*35ffd701SAndroid Build Coastguard Worker         Ignore64KBPadding = true;
53*35ffd701SAndroid Build Coastguard Worker     }
54*35ffd701SAndroid Build Coastguard Worker 
55*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetSkuTable().FtrLocalMemory)
56*35ffd701SAndroid Build Coastguard Worker      {
57*35ffd701SAndroid Build Coastguard Worker         Ignore64KBPadding |= (Surf.Flags.Info.Shared && !Surf.Flags.Info.NotLockable);
58*35ffd701SAndroid Build Coastguard Worker         Ignore64KBPadding |= ((GetGmmLibContext()->GetSkuTable().FtrLocalMemoryAllows4KB) && Surf.Flags.Info.NoOptimizationPadding);
59*35ffd701SAndroid Build Coastguard Worker         Ignore64KBPadding |= ((GetGmmLibContext()->GetSkuTable().FtrLocalMemoryAllows4KB || Surf.Flags.Info.NonLocalOnly) && (((Size * (100 + (GMM_GFX_SIZE_T)GetGmmLibContext()->GetAllowedPaddingFor64KbPagesPercentage())) / 100) < GFX_ALIGN(Size, GMM_KBYTE(64))));
60*35ffd701SAndroid Build Coastguard Worker     }
61*35ffd701SAndroid Build Coastguard Worker     else
62*35ffd701SAndroid Build Coastguard Worker     {
63*35ffd701SAndroid Build Coastguard Worker         // The final padded size cannot be larger then a set percentage of the original size
64*35ffd701SAndroid Build Coastguard Worker         if((Surf.Flags.Info.NoOptimizationPadding && !GFX_IS_ALIGNED(Size, GMM_KBYTE(64))) /*Surface is not 64kb aligned*/ ||
65*35ffd701SAndroid Build Coastguard Worker            (!Surf.Flags.Info.NoOptimizationPadding && (((Size * (100 + (GMM_GFX_SIZE_T)GetGmmLibContext()->GetAllowedPaddingFor64KbPagesPercentage())) / 100) < GFX_ALIGN(Size, GMM_KBYTE(64)))) /*10% padding TBC */)
66*35ffd701SAndroid Build Coastguard Worker         {
67*35ffd701SAndroid Build Coastguard Worker             Ignore64KBPadding |= true;
68*35ffd701SAndroid Build Coastguard Worker         }
69*35ffd701SAndroid Build Coastguard Worker     }
70*35ffd701SAndroid Build Coastguard Worker 
71*35ffd701SAndroid Build Coastguard Worker     // If 64KB paging is enabled pad out the resource to 64KB alignment
72*35ffd701SAndroid Build Coastguard Worker     if(GetGmmLibContext()->GetSkuTable().FtrWddm2_1_64kbPages &&
73*35ffd701SAndroid Build Coastguard Worker        // Ignore the padding for the above VirtualPadding or ESM cases
74*35ffd701SAndroid Build Coastguard Worker        (!Ignore64KBPadding) &&
75*35ffd701SAndroid Build Coastguard Worker        // Resource must be 64KB aligned
76*35ffd701SAndroid Build Coastguard Worker        (GFX_IS_ALIGNED(Surf.Alignment.BaseAlignment, GMM_KBYTE(64)) ||
77*35ffd701SAndroid Build Coastguard Worker         // Or must be aligned to a factor of 64KB
78*35ffd701SAndroid Build Coastguard Worker         (Surf.Alignment.BaseAlignment == GMM_KBYTE(32)) ||
79*35ffd701SAndroid Build Coastguard Worker         (Surf.Alignment.BaseAlignment == GMM_KBYTE(16)) ||
80*35ffd701SAndroid Build Coastguard Worker         (Surf.Alignment.BaseAlignment == GMM_KBYTE(8)) ||
81*35ffd701SAndroid Build Coastguard Worker         (Surf.Alignment.BaseAlignment == GMM_KBYTE(4))))
82*35ffd701SAndroid Build Coastguard Worker     {
83*35ffd701SAndroid Build Coastguard Worker         return 1;
84*35ffd701SAndroid Build Coastguard Worker     }
85*35ffd701SAndroid Build Coastguard Worker 
86*35ffd701SAndroid Build Coastguard Worker     return 0;
87*35ffd701SAndroid Build Coastguard Worker }
88*35ffd701SAndroid Build Coastguard Worker 
89*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
90*35ffd701SAndroid Build Coastguard Worker /// Allows clients to "create" any type of resource. This function does not
91*35ffd701SAndroid Build Coastguard Worker /// allocate any memory for the resource. It just calculates the various parameters
92*35ffd701SAndroid Build Coastguard Worker /// which are useful for the client and can be queried using other functions.
93*35ffd701SAndroid Build Coastguard Worker ///
94*35ffd701SAndroid Build Coastguard Worker /// @param[in]  GmmLib Context: Reference to ::GmmLibContext
95*35ffd701SAndroid Build Coastguard Worker /// @param[in]  CreateParams: Flags which specify what sort of resource to create
96*35ffd701SAndroid Build Coastguard Worker ///
97*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
98*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Create(GMM_RESCREATE_PARAMS & CreateParams)99*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmResourceInfoCommon::Create(GMM_RESCREATE_PARAMS &CreateParams)
100*35ffd701SAndroid Build Coastguard Worker {
101*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status = GMM_ERROR;
102*35ffd701SAndroid Build Coastguard Worker     // ToDo: Only Vk is using this Create API directly. Derive the GmmLibCOntext from the ClientContext stored in
103*35ffd701SAndroid Build Coastguard Worker     // ResInfo object.
104*35ffd701SAndroid Build Coastguard Worker     Status = Create(*(reinterpret_cast<GMM_CLIENT_CONTEXT *>(pClientContext)->GetLibContext()), CreateParams);
105*35ffd701SAndroid Build Coastguard Worker 
106*35ffd701SAndroid Build Coastguard Worker     return Status;
107*35ffd701SAndroid Build Coastguard Worker }
108*35ffd701SAndroid Build Coastguard Worker 
109*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
110*35ffd701SAndroid Build Coastguard Worker /// Allows clients to "create"  Custom memory layout received from the App as user pointer or DMABUF
111*35ffd701SAndroid Build Coastguard Worker // This function does not allocate any memory for the resource. It just calculates/ populates the various parameters
112*35ffd701SAndroid Build Coastguard Worker /// which are useful for the client and can be queried using other functions.
113*35ffd701SAndroid Build Coastguard Worker ///
114*35ffd701SAndroid Build Coastguard Worker /// @param[in]  GmmLib Context: Reference to ::GmmLibContext
115*35ffd701SAndroid Build Coastguard Worker /// @param[in]  CreateParams: Flags which specify what sort of resource to create
116*35ffd701SAndroid Build Coastguard Worker ///
117*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
118*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CreateCustomRes(Context & GmmLibContext,GMM_RESCREATE_CUSTOM_PARAMS & CreateParams)119*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmResourceInfoCommon::CreateCustomRes(Context &GmmLibContext, GMM_RESCREATE_CUSTOM_PARAMS &CreateParams)
120*35ffd701SAndroid Build Coastguard Worker {
121*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
122*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS               Status       = GMM_ERROR;
123*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *       pTextureCalc = NULL;
124*35ffd701SAndroid Build Coastguard Worker     uint32_t                 BitsPerPixel, i;
125*35ffd701SAndroid Build Coastguard Worker 
126*35ffd701SAndroid Build Coastguard Worker 
127*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
128*35ffd701SAndroid Build Coastguard Worker 
129*35ffd701SAndroid Build Coastguard Worker     GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
130*35ffd701SAndroid Build Coastguard Worker     pGmmUmdLibContext = reinterpret_cast<uint64_t>(&GmmLibContext);
131*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pGmmUmdLibContext, GMM_ERROR);
132*35ffd701SAndroid Build Coastguard Worker 
133*35ffd701SAndroid Build Coastguard Worker     if((CreateParams.Format > GMM_FORMAT_INVALID) &&
134*35ffd701SAndroid Build Coastguard Worker        (CreateParams.Format < GMM_RESOURCE_FORMATS))
135*35ffd701SAndroid Build Coastguard Worker     {
136*35ffd701SAndroid Build Coastguard Worker         BitsPerPixel = GetGmmLibContext()->GetPlatformInfo().FormatTable[CreateParams.Format].Element.BitsPer;
137*35ffd701SAndroid Build Coastguard Worker     }
138*35ffd701SAndroid Build Coastguard Worker     else
139*35ffd701SAndroid Build Coastguard Worker     {
140*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Format Error");
141*35ffd701SAndroid Build Coastguard Worker         Status = GMM_INVALIDPARAM;
142*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
143*35ffd701SAndroid Build Coastguard Worker     }
144*35ffd701SAndroid Build Coastguard Worker 
145*35ffd701SAndroid Build Coastguard Worker     pPlatform    = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
146*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
147*35ffd701SAndroid Build Coastguard Worker 
148*35ffd701SAndroid Build Coastguard Worker     Surf.Type                    = CreateParams.Type;
149*35ffd701SAndroid Build Coastguard Worker     Surf.Format                  = CreateParams.Format;
150*35ffd701SAndroid Build Coastguard Worker     Surf.BaseWidth               = CreateParams.BaseWidth64;
151*35ffd701SAndroid Build Coastguard Worker     Surf.BaseHeight              = CreateParams.BaseHeight;
152*35ffd701SAndroid Build Coastguard Worker     Surf.Flags                   = CreateParams.Flags;
153*35ffd701SAndroid Build Coastguard Worker     Surf.CachePolicy.Usage       = CreateParams.Usage;
154*35ffd701SAndroid Build Coastguard Worker     Surf.Pitch                   = CreateParams.Pitch;
155*35ffd701SAndroid Build Coastguard Worker     Surf.Size                    = CreateParams.Size;
156*35ffd701SAndroid Build Coastguard Worker     Surf.Alignment.BaseAlignment = CreateParams.BaseAlignment;
157*35ffd701SAndroid Build Coastguard Worker     Surf.MaxLod                  = 1;
158*35ffd701SAndroid Build Coastguard Worker     Surf.ArraySize               = 1;
159*35ffd701SAndroid Build Coastguard Worker     Surf.CpTag                   = CreateParams.CpTag;
160*35ffd701SAndroid Build Coastguard Worker 
161*35ffd701SAndroid Build Coastguard Worker #if(_DEBUG || _RELEASE_INTERNAL)
162*35ffd701SAndroid Build Coastguard Worker     Surf.Platform = GetGmmLibContext()->GetPlatformInfo().Platform;
163*35ffd701SAndroid Build Coastguard Worker #endif
164*35ffd701SAndroid Build Coastguard Worker     Surf.BitsPerPixel     = BitsPerPixel;
165*35ffd701SAndroid Build Coastguard Worker     Surf.Alignment.QPitch = (GMM_GLOBAL_GFX_SIZE_T)(Surf.Pitch * Surf.BaseHeight);
166*35ffd701SAndroid Build Coastguard Worker 
167*35ffd701SAndroid Build Coastguard Worker     pTextureCalc->SetTileMode(&Surf);
168*35ffd701SAndroid Build Coastguard Worker 
169*35ffd701SAndroid Build Coastguard Worker     if(GmmIsPlanar(Surf.Format))
170*35ffd701SAndroid Build Coastguard Worker     {
171*35ffd701SAndroid Build Coastguard Worker         pTextureCalc->SetPlanarOffsetInfo(&Surf, CreateParams);
172*35ffd701SAndroid Build Coastguard Worker 
173*35ffd701SAndroid Build Coastguard Worker         if (Surf.ArraySize > 1)
174*35ffd701SAndroid Build Coastguard Worker         {
175*35ffd701SAndroid Build Coastguard Worker             //Surf.OffsetInfo.Plane.ArrayQPitch = Surf.Size;  //Not required as this new interface doesn't support arrayed surfaces.
176*35ffd701SAndroid Build Coastguard Worker         }
177*35ffd701SAndroid Build Coastguard Worker 
178*35ffd701SAndroid Build Coastguard Worker         UpdateUnAlignedParams();
179*35ffd701SAndroid Build Coastguard Worker     }
180*35ffd701SAndroid Build Coastguard Worker 
181*35ffd701SAndroid Build Coastguard Worker     switch(Surf.Type)
182*35ffd701SAndroid Build Coastguard Worker     {
183*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_1D:
184*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_2D:
185*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PRIMARY:
186*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_SHADOW:
187*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_STAGING:
188*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GDI:
189*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_NNDI:
190*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_HARDWARE_MBM:
191*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_OVERLAY_INTERMEDIATE_SURFACE:
192*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_IFFS_MAPTOGTT:
193*35ffd701SAndroid Build Coastguard Worker #if _WIN32
194*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_DISPLAY:
195*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_REFERENCE:
196*35ffd701SAndroid Build Coastguard Worker #endif
197*35ffd701SAndroid Build Coastguard Worker         {
198*35ffd701SAndroid Build Coastguard Worker 
199*35ffd701SAndroid Build Coastguard Worker         if (Surf.ArraySize > 1)
200*35ffd701SAndroid Build Coastguard Worker         {
201*35ffd701SAndroid Build Coastguard Worker            // Surf.OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender =
202*35ffd701SAndroid Build Coastguard Worker            // Surf.OffsetInfo.Texture2DOffsetInfo.ArrayQPitchLock = Surf.Pitch * Surf.BaseHeight;  //Not required as this new interface doesn't support arrayed surfaces.
203*35ffd701SAndroid Build Coastguard Worker         }
204*35ffd701SAndroid Build Coastguard Worker 
205*35ffd701SAndroid Build Coastguard Worker             for(i = 0; i <= Surf.MaxLod; i++)
206*35ffd701SAndroid Build Coastguard Worker             {
207*35ffd701SAndroid Build Coastguard Worker                 Surf.OffsetInfo.Texture2DOffsetInfo.Offset[i] = 0;
208*35ffd701SAndroid Build Coastguard Worker             }
209*35ffd701SAndroid Build Coastguard Worker 
210*35ffd701SAndroid Build Coastguard Worker             break;
211*35ffd701SAndroid Build Coastguard Worker         }
212*35ffd701SAndroid Build Coastguard Worker         default:
213*35ffd701SAndroid Build Coastguard Worker         {
214*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "GmmTexAlloc: Unknown surface type!");
215*35ffd701SAndroid Build Coastguard Worker             Status = GMM_INVALIDPARAM;
216*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
217*35ffd701SAndroid Build Coastguard Worker             ;
218*35ffd701SAndroid Build Coastguard Worker         }
219*35ffd701SAndroid Build Coastguard Worker     };
220*35ffd701SAndroid Build Coastguard Worker 
221*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
222*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
223*35ffd701SAndroid Build Coastguard Worker 
224*35ffd701SAndroid Build Coastguard Worker ERROR_CASE:
225*35ffd701SAndroid Build Coastguard Worker     //Zero out all the members
226*35ffd701SAndroid Build Coastguard Worker     new(this) GmmResourceInfoCommon();
227*35ffd701SAndroid Build Coastguard Worker 
228*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
229*35ffd701SAndroid Build Coastguard Worker     return Status;
230*35ffd701SAndroid Build Coastguard Worker }
231*35ffd701SAndroid Build Coastguard Worker 
232*35ffd701SAndroid Build Coastguard Worker #ifndef __GMM_KMD__
233*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
234*35ffd701SAndroid Build Coastguard Worker /// Allows clients to "create"  Custom memory layout received from the App as user pointer or DMABUF
235*35ffd701SAndroid Build Coastguard Worker // This function does not allocate any memory for the resource. It just calculates/ populates the various parameters
236*35ffd701SAndroid Build Coastguard Worker /// which are useful for the client and can be queried using other functions.
237*35ffd701SAndroid Build Coastguard Worker ///
238*35ffd701SAndroid Build Coastguard Worker /// @param[in]  GmmLib Context: Reference to ::GmmLibContext
239*35ffd701SAndroid Build Coastguard Worker /// @param[in]  CreateParams: Flags which specify what sort of resource to create
240*35ffd701SAndroid Build Coastguard Worker ///
241*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
242*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CreateCustomRes_2(Context & GmmLibContext,GMM_RESCREATE_CUSTOM_PARAMS_2 & CreateParams)243*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmResourceInfoCommon::CreateCustomRes_2(Context &GmmLibContext, GMM_RESCREATE_CUSTOM_PARAMS_2 &CreateParams)
244*35ffd701SAndroid Build Coastguard Worker {
245*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
246*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS               Status       = GMM_ERROR;
247*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *       pTextureCalc = NULL;
248*35ffd701SAndroid Build Coastguard Worker     uint32_t                 BitsPerPixel, i;
249*35ffd701SAndroid Build Coastguard Worker 
250*35ffd701SAndroid Build Coastguard Worker 
251*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
252*35ffd701SAndroid Build Coastguard Worker 
253*35ffd701SAndroid Build Coastguard Worker     GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
254*35ffd701SAndroid Build Coastguard Worker     pGmmUmdLibContext = reinterpret_cast<uint64_t>(&GmmLibContext);
255*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pGmmUmdLibContext, GMM_ERROR);
256*35ffd701SAndroid Build Coastguard Worker 
257*35ffd701SAndroid Build Coastguard Worker 
258*35ffd701SAndroid Build Coastguard Worker     if((CreateParams.Format > GMM_FORMAT_INVALID) &&
259*35ffd701SAndroid Build Coastguard Worker        (CreateParams.Format < GMM_RESOURCE_FORMATS))
260*35ffd701SAndroid Build Coastguard Worker     {
261*35ffd701SAndroid Build Coastguard Worker         BitsPerPixel = GetGmmLibContext()->GetPlatformInfo().FormatTable[CreateParams.Format].Element.BitsPer;
262*35ffd701SAndroid Build Coastguard Worker     }
263*35ffd701SAndroid Build Coastguard Worker     else
264*35ffd701SAndroid Build Coastguard Worker     {
265*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Format Error");
266*35ffd701SAndroid Build Coastguard Worker         Status = GMM_INVALIDPARAM;
267*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
268*35ffd701SAndroid Build Coastguard Worker     }
269*35ffd701SAndroid Build Coastguard Worker 
270*35ffd701SAndroid Build Coastguard Worker     pPlatform    = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
271*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
272*35ffd701SAndroid Build Coastguard Worker 
273*35ffd701SAndroid Build Coastguard Worker     Surf.Type                    = CreateParams.Type;
274*35ffd701SAndroid Build Coastguard Worker     Surf.Format                  = CreateParams.Format;
275*35ffd701SAndroid Build Coastguard Worker     Surf.BaseWidth               = CreateParams.BaseWidth64;
276*35ffd701SAndroid Build Coastguard Worker     Surf.BaseHeight              = CreateParams.BaseHeight;
277*35ffd701SAndroid Build Coastguard Worker     Surf.Flags                   = CreateParams.Flags;
278*35ffd701SAndroid Build Coastguard Worker     Surf.CachePolicy.Usage       = CreateParams.Usage;
279*35ffd701SAndroid Build Coastguard Worker     Surf.Pitch                   = CreateParams.Pitch;
280*35ffd701SAndroid Build Coastguard Worker     Surf.Size                    = CreateParams.Size;
281*35ffd701SAndroid Build Coastguard Worker     Surf.Alignment.BaseAlignment = CreateParams.BaseAlignment;
282*35ffd701SAndroid Build Coastguard Worker     Surf.MaxLod                  = 1;
283*35ffd701SAndroid Build Coastguard Worker     Surf.ArraySize               = 1;
284*35ffd701SAndroid Build Coastguard Worker     Surf.CpTag                   = CreateParams.CpTag;
285*35ffd701SAndroid Build Coastguard Worker 
286*35ffd701SAndroid Build Coastguard Worker #if(_DEBUG || _RELEASE_INTERNAL)
287*35ffd701SAndroid Build Coastguard Worker     Surf.Platform = GetGmmLibContext()->GetPlatformInfo().Platform;
288*35ffd701SAndroid Build Coastguard Worker #endif
289*35ffd701SAndroid Build Coastguard Worker     Surf.BitsPerPixel     = BitsPerPixel;
290*35ffd701SAndroid Build Coastguard Worker     Surf.Alignment.QPitch = (GMM_GLOBAL_GFX_SIZE_T)(Surf.Pitch * Surf.BaseHeight);
291*35ffd701SAndroid Build Coastguard Worker 
292*35ffd701SAndroid Build Coastguard Worker     pTextureCalc->SetTileMode(&Surf);
293*35ffd701SAndroid Build Coastguard Worker 
294*35ffd701SAndroid Build Coastguard Worker     if(GmmIsPlanar(Surf.Format))
295*35ffd701SAndroid Build Coastguard Worker     {
296*35ffd701SAndroid Build Coastguard Worker         pTextureCalc->SetPlanarOffsetInfo_2(&Surf, CreateParams);
297*35ffd701SAndroid Build Coastguard Worker 
298*35ffd701SAndroid Build Coastguard Worker         if(Surf.ArraySize > 1)
299*35ffd701SAndroid Build Coastguard Worker         {
300*35ffd701SAndroid Build Coastguard Worker             //Not required as this new interface doesn't support arrayed surfaces.
301*35ffd701SAndroid Build Coastguard Worker         }
302*35ffd701SAndroid Build Coastguard Worker 
303*35ffd701SAndroid Build Coastguard Worker         UpdateUnAlignedParams();
304*35ffd701SAndroid Build Coastguard Worker     }
305*35ffd701SAndroid Build Coastguard Worker 
306*35ffd701SAndroid Build Coastguard Worker     switch(Surf.Type)
307*35ffd701SAndroid Build Coastguard Worker     {
308*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_1D:
309*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_2D:
310*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_PRIMARY:
311*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_SHADOW:
312*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_STAGING:
313*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_GDI:
314*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_NNDI:
315*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_HARDWARE_MBM:
316*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_OVERLAY_INTERMEDIATE_SURFACE:
317*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_IFFS_MAPTOGTT:
318*35ffd701SAndroid Build Coastguard Worker #if _WIN32
319*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_DISPLAY:
320*35ffd701SAndroid Build Coastguard Worker         case RESOURCE_WGBOX_ENCODE_REFERENCE:
321*35ffd701SAndroid Build Coastguard Worker #endif
322*35ffd701SAndroid Build Coastguard Worker         {
323*35ffd701SAndroid Build Coastguard Worker             if(Surf.ArraySize > 1)
324*35ffd701SAndroid Build Coastguard Worker             {
325*35ffd701SAndroid Build Coastguard Worker                 //Not required as this new interface doesn't support arrayed surfaces.
326*35ffd701SAndroid Build Coastguard Worker             }
327*35ffd701SAndroid Build Coastguard Worker 
328*35ffd701SAndroid Build Coastguard Worker             for(i = 0; i <= Surf.MaxLod; i++)
329*35ffd701SAndroid Build Coastguard Worker             {
330*35ffd701SAndroid Build Coastguard Worker                 Surf.OffsetInfo.Texture2DOffsetInfo.Offset[i] = 0;
331*35ffd701SAndroid Build Coastguard Worker             }
332*35ffd701SAndroid Build Coastguard Worker 
333*35ffd701SAndroid Build Coastguard Worker             break;
334*35ffd701SAndroid Build Coastguard Worker         }
335*35ffd701SAndroid Build Coastguard Worker         default:
336*35ffd701SAndroid Build Coastguard Worker         {
337*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "GmmTexAlloc: Unknown surface type!");
338*35ffd701SAndroid Build Coastguard Worker             Status = GMM_INVALIDPARAM;
339*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
340*35ffd701SAndroid Build Coastguard Worker             ;
341*35ffd701SAndroid Build Coastguard Worker         }
342*35ffd701SAndroid Build Coastguard Worker     };
343*35ffd701SAndroid Build Coastguard Worker 
344*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.UnifiedAuxSurface || Surf.Flags.Gpu.CCS)
345*35ffd701SAndroid Build Coastguard Worker     {
346*35ffd701SAndroid Build Coastguard Worker 
347*35ffd701SAndroid Build Coastguard Worker         if(GetGmmLibContext()->GetSkuTable().FtrLinearCCS)
348*35ffd701SAndroid Build Coastguard Worker         {
349*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Flags.Gpu.__NonMsaaLinearCCS = 1;
350*35ffd701SAndroid Build Coastguard Worker         }
351*35ffd701SAndroid Build Coastguard Worker 
352*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Flags.Info.TiledW  = 0;
353*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Flags.Info.TiledYf = 0;
354*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Flags.Info.TiledX  = 0;
355*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Flags.Info.Linear  = 1;
356*35ffd701SAndroid Build Coastguard Worker         GMM_SET_64KB_TILE(AuxSurf.Flags, 0, GetGmmLibContext());
357*35ffd701SAndroid Build Coastguard Worker         GMM_SET_4KB_TILE(AuxSurf.Flags, 0, GetGmmLibContext());
358*35ffd701SAndroid Build Coastguard Worker 
359*35ffd701SAndroid Build Coastguard Worker         AuxSurf.ArraySize    = 1;
360*35ffd701SAndroid Build Coastguard Worker         AuxSurf.BitsPerPixel = 8;
361*35ffd701SAndroid Build Coastguard Worker 
362*35ffd701SAndroid Build Coastguard Worker         if(GmmIsPlanar(CreateParams.Format) || GmmIsUVPacked(CreateParams.Format))
363*35ffd701SAndroid Build Coastguard Worker         {
364*35ffd701SAndroid Build Coastguard Worker             AuxSurf.OffsetInfo.Plane.X[GMM_PLANE_Y] = CreateParams.AuxSurf.PlaneOffset.X[GMM_PLANE_Y];
365*35ffd701SAndroid Build Coastguard Worker             AuxSurf.OffsetInfo.Plane.Y[GMM_PLANE_Y] = CreateParams.AuxSurf.PlaneOffset.Y[GMM_PLANE_Y];
366*35ffd701SAndroid Build Coastguard Worker             AuxSurf.OffsetInfo.Plane.X[GMM_PLANE_U] = CreateParams.AuxSurf.PlaneOffset.X[GMM_PLANE_U];
367*35ffd701SAndroid Build Coastguard Worker             AuxSurf.OffsetInfo.Plane.Y[GMM_PLANE_U] = CreateParams.AuxSurf.PlaneOffset.Y[GMM_PLANE_U];
368*35ffd701SAndroid Build Coastguard Worker             AuxSurf.OffsetInfo.Plane.X[GMM_PLANE_V] = CreateParams.AuxSurf.PlaneOffset.X[GMM_PLANE_V];
369*35ffd701SAndroid Build Coastguard Worker             AuxSurf.OffsetInfo.Plane.Y[GMM_PLANE_V] = CreateParams.AuxSurf.PlaneOffset.Y[GMM_PLANE_V];
370*35ffd701SAndroid Build Coastguard Worker             AuxSurf.OffsetInfo.Plane.ArrayQPitch    = CreateParams.AuxSurf.Size;
371*35ffd701SAndroid Build Coastguard Worker         }
372*35ffd701SAndroid Build Coastguard Worker 
373*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Size = CreateParams.AuxSurf.Size;
374*35ffd701SAndroid Build Coastguard Worker 
375*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Pitch     = CreateParams.AuxSurf.Pitch;
376*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Type      = RESOURCE_BUFFER;
377*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Alignment = {0};
378*35ffd701SAndroid Build Coastguard Worker 
379*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Alignment.QPitch        = GFX_ULONG_CAST(AuxSurf.Size);
380*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Alignment.BaseAlignment = CreateParams.AuxSurf.BaseAlignment; //TODO: TiledResource?
381*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Size                    = GFX_ALIGN(AuxSurf.Size, PAGE_SIZE); //page-align final size
382*35ffd701SAndroid Build Coastguard Worker 
383*35ffd701SAndroid Build Coastguard Worker         if(AuxSurf.Flags.Gpu.TiledResource)
384*35ffd701SAndroid Build Coastguard Worker         {
385*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Alignment.BaseAlignment = GMM_KBYTE(64);                          //TODO: TiledResource?
386*35ffd701SAndroid Build Coastguard Worker             AuxSurf.Size                    = GFX_ALIGN(AuxSurf.Size, GMM_KBYTE(64)); //page-align final size
387*35ffd701SAndroid Build Coastguard Worker         }
388*35ffd701SAndroid Build Coastguard Worker 
389*35ffd701SAndroid Build Coastguard Worker         //Clear compression request in CCS
390*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Flags.Info.RenderCompressed = 0;
391*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Flags.Info.MediaCompressed  = 0;
392*35ffd701SAndroid Build Coastguard Worker         AuxSurf.Flags.Info.RedecribedPlanes = 0;
393*35ffd701SAndroid Build Coastguard Worker         pTextureCalc->SetTileMode(&AuxSurf);
394*35ffd701SAndroid Build Coastguard Worker         AuxSurf.UnpaddedSize = AuxSurf.Size;
395*35ffd701SAndroid Build Coastguard Worker     }
396*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
397*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
398*35ffd701SAndroid Build Coastguard Worker 
399*35ffd701SAndroid Build Coastguard Worker ERROR_CASE:
400*35ffd701SAndroid Build Coastguard Worker     //Zero out all the members
401*35ffd701SAndroid Build Coastguard Worker     new(this) GmmResourceInfoCommon();
402*35ffd701SAndroid Build Coastguard Worker 
403*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
404*35ffd701SAndroid Build Coastguard Worker     return Status;
405*35ffd701SAndroid Build Coastguard Worker }
406*35ffd701SAndroid Build Coastguard Worker #endif
407*35ffd701SAndroid Build Coastguard Worker 
408*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
409*35ffd701SAndroid Build Coastguard Worker /// Allows clients to "create" any type of resource. This function does not
410*35ffd701SAndroid Build Coastguard Worker /// allocate any memory for the resource. It just calculates the various parameters
411*35ffd701SAndroid Build Coastguard Worker /// which are useful for the client and can be queried using other functions.
412*35ffd701SAndroid Build Coastguard Worker ///
413*35ffd701SAndroid Build Coastguard Worker /// @param[in]  GmmLib Context: Reference to ::GmmLibContext
414*35ffd701SAndroid Build Coastguard Worker /// @param[in]  CreateParams: Flags which specify what sort of resource to create
415*35ffd701SAndroid Build Coastguard Worker ///
416*35ffd701SAndroid Build Coastguard Worker /// @return     ::GMM_STATUS
417*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Create(Context & GmmLibContext,GMM_RESCREATE_PARAMS & CreateParams)418*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmResourceInfoCommon::Create(Context &GmmLibContext, GMM_RESCREATE_PARAMS &CreateParams)
419*35ffd701SAndroid Build Coastguard Worker {
420*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
421*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS               Status       = GMM_ERROR;
422*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *       pTextureCalc = NULL;
423*35ffd701SAndroid Build Coastguard Worker 
424*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
425*35ffd701SAndroid Build Coastguard Worker 
426*35ffd701SAndroid Build Coastguard Worker     GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
427*35ffd701SAndroid Build Coastguard Worker     pGmmUmdLibContext = reinterpret_cast<uint64_t>(&GmmLibContext);
428*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pGmmUmdLibContext, GMM_ERROR);
429*35ffd701SAndroid Build Coastguard Worker 
430*35ffd701SAndroid Build Coastguard Worker     if(CreateParams.Flags.Info.ExistingSysMem &&
431*35ffd701SAndroid Build Coastguard Worker        (CreateParams.Flags.Info.TiledW ||
432*35ffd701SAndroid Build Coastguard Worker         CreateParams.Flags.Info.TiledX ||
433*35ffd701SAndroid Build Coastguard Worker         GMM_IS_4KB_TILE(CreateParams.Flags) ||
434*35ffd701SAndroid Build Coastguard Worker         GMM_IS_64KB_TILE(CreateParams.Flags)))
435*35ffd701SAndroid Build Coastguard Worker     {
436*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Tiled System Accelerated Memory not supported.");
437*35ffd701SAndroid Build Coastguard Worker         Status = GMM_INVALIDPARAM;
438*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
439*35ffd701SAndroid Build Coastguard Worker     }
440*35ffd701SAndroid Build Coastguard Worker 
441*35ffd701SAndroid Build Coastguard Worker     if(!CopyClientParams(CreateParams))
442*35ffd701SAndroid Build Coastguard Worker     {
443*35ffd701SAndroid Build Coastguard Worker         Status = GMM_INVALIDPARAM;
444*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
445*35ffd701SAndroid Build Coastguard Worker     }
446*35ffd701SAndroid Build Coastguard Worker 
447*35ffd701SAndroid Build Coastguard Worker     pPlatform    = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
448*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
449*35ffd701SAndroid Build Coastguard Worker 
450*35ffd701SAndroid Build Coastguard Worker     if (!pTextureCalc)
451*35ffd701SAndroid Build Coastguard Worker     {
452*35ffd701SAndroid Build Coastguard Worker         Status = GMM_ERROR;
453*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Texture Calculation pointer is NULL.");
454*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
455*35ffd701SAndroid Build Coastguard Worker     }
456*35ffd701SAndroid Build Coastguard Worker 
457*35ffd701SAndroid Build Coastguard Worker #if defined(__GMM_KMD__) || !defined(_WIN32)
458*35ffd701SAndroid Build Coastguard Worker     if(!CreateParams.Flags.Info.ExistingSysMem)
459*35ffd701SAndroid Build Coastguard Worker #else
460*35ffd701SAndroid Build Coastguard Worker     // TiledResource uses a private gfx alloc, which doesn't receive a  WDDM CreateAllocation
461*35ffd701SAndroid Build Coastguard Worker     if(!CreateParams.Flags.Info.ExistingSysMem &&
462*35ffd701SAndroid Build Coastguard Worker        (CreateParams.NoGfxMemory || CreateParams.Flags.Gpu.TiledResource))
463*35ffd701SAndroid Build Coastguard Worker #endif
464*35ffd701SAndroid Build Coastguard Worker     {
465*35ffd701SAndroid Build Coastguard Worker         if(!ValidateParams())
466*35ffd701SAndroid Build Coastguard Worker         {
467*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Invalid parameter!");
468*35ffd701SAndroid Build Coastguard Worker             Status = GMM_INVALIDPARAM;
469*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
470*35ffd701SAndroid Build Coastguard Worker         }
471*35ffd701SAndroid Build Coastguard Worker 
472*35ffd701SAndroid Build Coastguard Worker         if(GMM_SUCCESS != pTextureCalc->AllocateTexture(&Surf))
473*35ffd701SAndroid Build Coastguard Worker         {
474*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "GmmTexAlloc failed!");
475*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
476*35ffd701SAndroid Build Coastguard Worker         }
477*35ffd701SAndroid Build Coastguard Worker 
478*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Gpu.UnifiedAuxSurface)
479*35ffd701SAndroid Build Coastguard Worker         {
480*35ffd701SAndroid Build Coastguard Worker             GMM_GFX_SIZE_T TotalSize;
481*35ffd701SAndroid Build Coastguard Worker             uint32_t       Alignment;
482*35ffd701SAndroid Build Coastguard Worker 
483*35ffd701SAndroid Build Coastguard Worker             if(GMM_SUCCESS != pTextureCalc->FillTexCCS(&Surf, (AuxSecSurf.Type != RESOURCE_INVALID ? &AuxSecSurf : &AuxSurf)))
484*35ffd701SAndroid Build Coastguard Worker             {
485*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "GmmTexAlloc failed!");
486*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
487*35ffd701SAndroid Build Coastguard Worker             }
488*35ffd701SAndroid Build Coastguard Worker 
489*35ffd701SAndroid Build Coastguard Worker             if(AuxSurf.Size == 0 && AuxSurf.Type != RESOURCE_INVALID && GMM_SUCCESS != pTextureCalc->AllocateTexture(&AuxSurf))
490*35ffd701SAndroid Build Coastguard Worker             {
491*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "GmmTexAlloc failed!");
492*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
493*35ffd701SAndroid Build Coastguard Worker             }
494*35ffd701SAndroid Build Coastguard Worker 
495*35ffd701SAndroid Build Coastguard Worker             AuxSurf.UnpaddedSize = AuxSurf.Size;
496*35ffd701SAndroid Build Coastguard Worker 
497*35ffd701SAndroid Build Coastguard Worker             if(Surf.Flags.Gpu.IndirectClearColor ||
498*35ffd701SAndroid Build Coastguard Worker                Surf.Flags.Gpu.ColorDiscard)
499*35ffd701SAndroid Build Coastguard Worker             {
500*35ffd701SAndroid Build Coastguard Worker                 if(GetGmmLibContext()->GetSkuTable().FtrFlatPhysCCS && AuxSurf.Type == RESOURCE_INVALID)
501*35ffd701SAndroid Build Coastguard Worker                 {
502*35ffd701SAndroid Build Coastguard Worker                     //ie only AuxType is CCS, doesn't exist with FlatCCS, enable it for CC
503*35ffd701SAndroid Build Coastguard Worker                     if (!GetGmmLibContext()->GetSkuTable().FtrXe2Compression || (GetGmmLibContext()->GetSkuTable().FtrXe2Compression && (Surf.MSAA.NumSamples > 1)))
504*35ffd701SAndroid Build Coastguard Worker                     {
505*35ffd701SAndroid Build Coastguard Worker                         AuxSurf.Type = Surf.Type;
506*35ffd701SAndroid Build Coastguard Worker                     }
507*35ffd701SAndroid Build Coastguard Worker                 }
508*35ffd701SAndroid Build Coastguard Worker                 if (!Surf.Flags.Gpu.TiledResource)
509*35ffd701SAndroid Build Coastguard Worker                 {
510*35ffd701SAndroid Build Coastguard Worker                     if (!GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
511*35ffd701SAndroid Build Coastguard Worker                     {
512*35ffd701SAndroid Build Coastguard Worker                         AuxSurf.CCSize = PAGE_SIZE; // 128bit Float Value + 32bit RT Native Value + Padding.
513*35ffd701SAndroid Build Coastguard Worker                         AuxSurf.Size += PAGE_SIZE;
514*35ffd701SAndroid Build Coastguard Worker                     }
515*35ffd701SAndroid Build Coastguard Worker                     else
516*35ffd701SAndroid Build Coastguard Worker                     {
517*35ffd701SAndroid Build Coastguard Worker 
518*35ffd701SAndroid Build Coastguard Worker                         if (Surf.MSAA.NumSamples > 1)
519*35ffd701SAndroid Build Coastguard Worker                         {
520*35ffd701SAndroid Build Coastguard Worker                             AuxSurf.UnpaddedSize += PAGE_SIZE;
521*35ffd701SAndroid Build Coastguard Worker                             AuxSurf.Size += PAGE_SIZE;              // Clear Color stored only for MSAA surfaces
522*35ffd701SAndroid Build Coastguard Worker                         }
523*35ffd701SAndroid Build Coastguard Worker                     }
524*35ffd701SAndroid Build Coastguard Worker                 }
525*35ffd701SAndroid Build Coastguard Worker                 else
526*35ffd701SAndroid Build Coastguard Worker                 {
527*35ffd701SAndroid Build Coastguard Worker                     if (!GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
528*35ffd701SAndroid Build Coastguard Worker                     {
529*35ffd701SAndroid Build Coastguard Worker                         AuxSurf.CCSize = GMM_KBYTE(64); // 128bit Float Value + 32bit RT Native Value + Padding.
530*35ffd701SAndroid Build Coastguard Worker                         AuxSurf.Size += GMM_KBYTE(64);
531*35ffd701SAndroid Build Coastguard Worker                     }
532*35ffd701SAndroid Build Coastguard Worker                     else
533*35ffd701SAndroid Build Coastguard Worker                     {
534*35ffd701SAndroid Build Coastguard Worker                         if (Surf.MSAA.NumSamples > 1)
535*35ffd701SAndroid Build Coastguard Worker                         {
536*35ffd701SAndroid Build Coastguard Worker                             AuxSurf.UnpaddedSize += GMM_KBYTE(64);
537*35ffd701SAndroid Build Coastguard Worker                             AuxSurf.Size += GMM_KBYTE(64);              // Clear Color stored only for MSAA surfaces, stored as part of MCS
538*35ffd701SAndroid Build Coastguard Worker                         }
539*35ffd701SAndroid Build Coastguard Worker                     }
540*35ffd701SAndroid Build Coastguard Worker                 }
541*35ffd701SAndroid Build Coastguard Worker             }
542*35ffd701SAndroid Build Coastguard Worker 
543*35ffd701SAndroid Build Coastguard Worker   	    if(Surf.Flags.Gpu.ProceduralTexture)
544*35ffd701SAndroid Build Coastguard Worker             {
545*35ffd701SAndroid Build Coastguard Worker                 //Do not require main surface access either in GPUVA/physical space.
546*35ffd701SAndroid Build Coastguard Worker                 Surf.Size = 0;
547*35ffd701SAndroid Build Coastguard Worker             }
548*35ffd701SAndroid Build Coastguard Worker 
549*35ffd701SAndroid Build Coastguard Worker             TotalSize = Surf.Size + AuxSurf.Size; //Not including AuxSecSurf size, multi-Aux surface isn't supported for displayables
550*35ffd701SAndroid Build Coastguard Worker             Alignment = GFX_ULONG_CAST(Surf.Pitch * pPlatform->TileInfo[Surf.TileMode].LogicalTileHeight);
551*35ffd701SAndroid Build Coastguard Worker 
552*35ffd701SAndroid Build Coastguard Worker             // We need to pad the aux size to the size of the paired surface's tile row (i.e. Pitch * TileHeight) to
553*35ffd701SAndroid Build Coastguard Worker             // ensure the entire surface can be described with a constant pitch (for GGTT aliasing, clean FENCE'ing and
554*35ffd701SAndroid Build Coastguard Worker             // AcquireSwizzlingRange, even though the aux isn't intentionally part of such fencing).
555*35ffd701SAndroid Build Coastguard Worker             if(Surf.Flags.Gpu.FlipChain &&
556*35ffd701SAndroid Build Coastguard Worker                (!__GMM_IS_ALIGN(TotalSize, Alignment)))
557*35ffd701SAndroid Build Coastguard Worker             {
558*35ffd701SAndroid Build Coastguard Worker                 AuxSurf.Size += (GFX_ALIGN_NP2(TotalSize, Alignment) - TotalSize);
559*35ffd701SAndroid Build Coastguard Worker             }
560*35ffd701SAndroid Build Coastguard Worker 
561*35ffd701SAndroid Build Coastguard Worker             if((Surf.Size + AuxSurf.Size + AuxSecSurf.Size) > (GMM_GFX_SIZE_T)(pPlatform->SurfaceMaxSize))
562*35ffd701SAndroid Build Coastguard Worker             {
563*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Surface too large!");
564*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
565*35ffd701SAndroid Build Coastguard Worker             }
566*35ffd701SAndroid Build Coastguard Worker         }
567*35ffd701SAndroid Build Coastguard Worker     }
568*35ffd701SAndroid Build Coastguard Worker 
569*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Info.ExistingSysMem)
570*35ffd701SAndroid Build Coastguard Worker     {
571*35ffd701SAndroid Build Coastguard Worker         Surf.ExistingSysMem.IsGmmAllocated =
572*35ffd701SAndroid Build Coastguard Worker         (CreateParams.pExistingSysMem &&
573*35ffd701SAndroid Build Coastguard Worker          CreateParams.ExistingSysMemSize) ?
574*35ffd701SAndroid Build Coastguard Worker         false :
575*35ffd701SAndroid Build Coastguard Worker         true;
576*35ffd701SAndroid Build Coastguard Worker 
577*35ffd701SAndroid Build Coastguard Worker         if(!Surf.ExistingSysMem.IsGmmAllocated)
578*35ffd701SAndroid Build Coastguard Worker         {
579*35ffd701SAndroid Build Coastguard Worker             Surf.ExistingSysMem.IsPageAligned =
580*35ffd701SAndroid Build Coastguard Worker             (((CreateParams.pExistingSysMem & (PAGE_SIZE - 1)) == 0) &&
581*35ffd701SAndroid Build Coastguard Worker              (((CreateParams.pExistingSysMem + CreateParams.ExistingSysMemSize) & (PAGE_SIZE - 1)) == 0)) ?
582*35ffd701SAndroid Build Coastguard Worker             true :
583*35ffd701SAndroid Build Coastguard Worker             false;
584*35ffd701SAndroid Build Coastguard Worker         }
585*35ffd701SAndroid Build Coastguard Worker 
586*35ffd701SAndroid Build Coastguard Worker         if(!ValidateParams())
587*35ffd701SAndroid Build Coastguard Worker         {
588*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Invalid parameter!");
589*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
590*35ffd701SAndroid Build Coastguard Worker         }
591*35ffd701SAndroid Build Coastguard Worker 
592*35ffd701SAndroid Build Coastguard Worker         // Get surface Gfx memory size required.
593*35ffd701SAndroid Build Coastguard Worker         if(GMM_SUCCESS != pTextureCalc->AllocateTexture(&Surf))
594*35ffd701SAndroid Build Coastguard Worker         {
595*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "GmmTexAlloc failed!");
596*35ffd701SAndroid Build Coastguard Worker             goto ERROR_CASE;
597*35ffd701SAndroid Build Coastguard Worker         }
598*35ffd701SAndroid Build Coastguard Worker 
599*35ffd701SAndroid Build Coastguard Worker         if(CreateParams.pExistingSysMem &&
600*35ffd701SAndroid Build Coastguard Worker            CreateParams.ExistingSysMemSize)
601*35ffd701SAndroid Build Coastguard Worker         {
602*35ffd701SAndroid Build Coastguard Worker             // Client provided own memory and is not assumed to be Gfx aligned
603*35ffd701SAndroid Build Coastguard Worker             ExistingSysMem.IsGmmAllocated = 0;
604*35ffd701SAndroid Build Coastguard Worker 
605*35ffd701SAndroid Build Coastguard Worker             ExistingSysMem.pExistingSysMem = CreateParams.pExistingSysMem;
606*35ffd701SAndroid Build Coastguard Worker             ExistingSysMem.Size            = CreateParams.ExistingSysMemSize;
607*35ffd701SAndroid Build Coastguard Worker 
608*35ffd701SAndroid Build Coastguard Worker             // An upper dword of 0xffffffff is invalid and may mean the address
609*35ffd701SAndroid Build Coastguard Worker             // was sign extended or came from a rogue UMD. In either case
610*35ffd701SAndroid Build Coastguard Worker             // we can truncate the address down to 32 bits prevent attempts
611*35ffd701SAndroid Build Coastguard Worker             // to access an invalid address range.
612*35ffd701SAndroid Build Coastguard Worker             if((ExistingSysMem.pExistingSysMem & (0xffffffff00000000ull)) == (0xffffffff00000000ull))
613*35ffd701SAndroid Build Coastguard Worker             {
614*35ffd701SAndroid Build Coastguard Worker                 ExistingSysMem.pExistingSysMem &= 0xffffffff;
615*35ffd701SAndroid Build Coastguard Worker             }
616*35ffd701SAndroid Build Coastguard Worker 
617*35ffd701SAndroid Build Coastguard Worker             //Align the base address to new ESM requirements.
618*35ffd701SAndroid Build Coastguard Worker             if(!Surf.ExistingSysMem.IsPageAligned)
619*35ffd701SAndroid Build Coastguard Worker             {
620*35ffd701SAndroid Build Coastguard Worker                 if(GMM_SUCCESS != ApplyExistingSysMemRestrictions())
621*35ffd701SAndroid Build Coastguard Worker                 {
622*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(0, "Malloc'ed Sys Mem too small for gfx surface!");
623*35ffd701SAndroid Build Coastguard Worker                     goto ERROR_CASE;
624*35ffd701SAndroid Build Coastguard Worker                 }
625*35ffd701SAndroid Build Coastguard Worker             }
626*35ffd701SAndroid Build Coastguard Worker             else
627*35ffd701SAndroid Build Coastguard Worker             {
628*35ffd701SAndroid Build Coastguard Worker                 ExistingSysMem.pVirtAddress =
629*35ffd701SAndroid Build Coastguard Worker                 ExistingSysMem.pGfxAlignedVirtAddress = CreateParams.pExistingSysMem;
630*35ffd701SAndroid Build Coastguard Worker             }
631*35ffd701SAndroid Build Coastguard Worker 
632*35ffd701SAndroid Build Coastguard Worker             if((ExistingSysMem.pVirtAddress + Surf.Size) >
633*35ffd701SAndroid Build Coastguard Worker                (CreateParams.pExistingSysMem + ExistingSysMem.Size))
634*35ffd701SAndroid Build Coastguard Worker             {
635*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Malloc'ed Sys Mem too small for gfx surface");
636*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
637*35ffd701SAndroid Build Coastguard Worker             }
638*35ffd701SAndroid Build Coastguard Worker         }
639*35ffd701SAndroid Build Coastguard Worker         else
640*35ffd701SAndroid Build Coastguard Worker         {
641*35ffd701SAndroid Build Coastguard Worker             __GMM_BUFFER_TYPE Restrictions = {0};
642*35ffd701SAndroid Build Coastguard Worker 
643*35ffd701SAndroid Build Coastguard Worker             ExistingSysMem.IsGmmAllocated     = 1;
644*35ffd701SAndroid Build Coastguard Worker             Surf.ExistingSysMem.IsPageAligned = 1;
645*35ffd701SAndroid Build Coastguard Worker 
646*35ffd701SAndroid Build Coastguard Worker             // Adjust memory size to compensate for Gfx alignment.
647*35ffd701SAndroid Build Coastguard Worker             pTextureCalc->GetResRestrictions(&Surf, Restrictions);
648*35ffd701SAndroid Build Coastguard Worker             ExistingSysMem.Size = Restrictions.Alignment + Surf.Size;
649*35ffd701SAndroid Build Coastguard Worker 
650*35ffd701SAndroid Build Coastguard Worker             ExistingSysMem.pVirtAddress = (uint64_t)GMM_MALLOC(GFX_ULONG_CAST(ExistingSysMem.Size));
651*35ffd701SAndroid Build Coastguard Worker             if(!ExistingSysMem.pVirtAddress)
652*35ffd701SAndroid Build Coastguard Worker             {
653*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF(0, "Failed to allocate System Accelerated Memory.");
654*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
655*35ffd701SAndroid Build Coastguard Worker             }
656*35ffd701SAndroid Build Coastguard Worker             else
657*35ffd701SAndroid Build Coastguard Worker             {
658*35ffd701SAndroid Build Coastguard Worker                 ExistingSysMem.pGfxAlignedVirtAddress = (uint64_t)GFX_ALIGN(ExistingSysMem.pVirtAddress, Restrictions.Alignment);
659*35ffd701SAndroid Build Coastguard Worker             }
660*35ffd701SAndroid Build Coastguard Worker         }
661*35ffd701SAndroid Build Coastguard Worker     }
662*35ffd701SAndroid Build Coastguard Worker 
663*35ffd701SAndroid Build Coastguard Worker     if(Is64KBPageSuitable() && GetGmmLibContext()->GetSkuTable().FtrLocalMemory)
664*35ffd701SAndroid Build Coastguard Worker     {
665*35ffd701SAndroid Build Coastguard Worker         // BaseAlignment can be greater than 64KB and needs to be aligned to 64KB
666*35ffd701SAndroid Build Coastguard Worker         Surf.Alignment.BaseAlignment = GFX_MAX(GFX_ALIGN(Surf.Alignment.BaseAlignment, GMM_KBYTE(64)), GMM_KBYTE(64));
667*35ffd701SAndroid Build Coastguard Worker     }
668*35ffd701SAndroid Build Coastguard Worker 
669*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
670*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
671*35ffd701SAndroid Build Coastguard Worker 
672*35ffd701SAndroid Build Coastguard Worker ERROR_CASE:
673*35ffd701SAndroid Build Coastguard Worker     //Zero out all the members
674*35ffd701SAndroid Build Coastguard Worker     new(this) GmmResourceInfoCommon();
675*35ffd701SAndroid Build Coastguard Worker 
676*35ffd701SAndroid Build Coastguard Worker     if(CreateParams.pPreallocatedResInfo)
677*35ffd701SAndroid Build Coastguard Worker     {
678*35ffd701SAndroid Build Coastguard Worker         this->GetResFlags().Info.__PreallocatedResInfo = 1; // Set flag if PreAllocated ResInfo has been set by the Client.
679*35ffd701SAndroid Build Coastguard Worker     }
680*35ffd701SAndroid Build Coastguard Worker 
681*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_EXIT;
682*35ffd701SAndroid Build Coastguard Worker     return Status;
683*35ffd701SAndroid Build Coastguard Worker }
684*35ffd701SAndroid Build Coastguard Worker 
UpdateUnAlignedParams()685*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmResourceInfoCommon::UpdateUnAlignedParams()
686*35ffd701SAndroid Build Coastguard Worker {
687*35ffd701SAndroid Build Coastguard Worker     uint32_t          YHeight = 0, VHeight = 0, Height = 0;
688*35ffd701SAndroid Build Coastguard Worker     uint32_t          WidthBytesPhysical = GFX_ULONG_CAST(Surf.BaseWidth) * Surf.BitsPerPixel >> 3;
689*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc       = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
690*35ffd701SAndroid Build Coastguard Worker 
691*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(((Surf.TileMode < GMM_TILE_MODES) && (Surf.TileMode >= TILE_NONE)), VOIDRETURN);
692*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
693*35ffd701SAndroid Build Coastguard Worker 
694*35ffd701SAndroid Build Coastguard Worker     Height = Surf.BaseHeight;
695*35ffd701SAndroid Build Coastguard Worker 
696*35ffd701SAndroid Build Coastguard Worker     switch(Surf.Format)
697*35ffd701SAndroid Build Coastguard Worker     {
698*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC1: // IMC1 = IMC3 with Swapped U/V
699*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC3:
700*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV420: // Same as IMC3.
701*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
702*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
703*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
704*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
705*35ffd701SAndroid Build Coastguard Worker         // UUUU
706*35ffd701SAndroid Build Coastguard Worker         // UUUU
707*35ffd701SAndroid Build Coastguard Worker         // VVVV
708*35ffd701SAndroid Build Coastguard Worker         // VVVV
709*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422V: // Similar to IMC3 but U/V are full width.
710*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
711*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
712*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
713*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
714*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
715*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
716*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
717*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
718*35ffd701SAndroid Build Coastguard Worker             {
719*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
720*35ffd701SAndroid Build Coastguard Worker 
721*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_ALIGN(GFX_CEIL_DIV(Surf.BaseHeight, 2), GMM_IMCx_PLANE_ROW_ALIGNMENT);
722*35ffd701SAndroid Build Coastguard Worker 
723*35ffd701SAndroid Build Coastguard Worker                 break;
724*35ffd701SAndroid Build Coastguard Worker             }
725*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411R_TYPE: //Similar to IMC3 but U/V are quarther height and full width.
726*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
727*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
728*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
729*35ffd701SAndroid Build Coastguard Worker             //YYYYYYYY
730*35ffd701SAndroid Build Coastguard Worker             //UUUUUUUU
731*35ffd701SAndroid Build Coastguard Worker             //VVVVVVVV
732*35ffd701SAndroid Build Coastguard Worker             {
733*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
734*35ffd701SAndroid Build Coastguard Worker 
735*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_ALIGN(GFX_CEIL_DIV(Surf.BaseHeight, 4), GMM_IMCx_PLANE_ROW_ALIGNMENT);
736*35ffd701SAndroid Build Coastguard Worker 
737*35ffd701SAndroid Build Coastguard Worker                 break;
738*35ffd701SAndroid Build Coastguard Worker             }
739*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV411: // Similar to IMC3 but U/V are quarter width and full height.
740*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
741*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
742*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
743*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
744*35ffd701SAndroid Build Coastguard Worker         // UU
745*35ffd701SAndroid Build Coastguard Worker         // UU
746*35ffd701SAndroid Build Coastguard Worker         // UU
747*35ffd701SAndroid Build Coastguard Worker         // UU
748*35ffd701SAndroid Build Coastguard Worker         // VV
749*35ffd701SAndroid Build Coastguard Worker         // VV
750*35ffd701SAndroid Build Coastguard Worker         // VV
751*35ffd701SAndroid Build Coastguard Worker         // VV
752*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV422H: // Similar to IMC3 but U/V are full height.
753*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
754*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
755*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
756*35ffd701SAndroid Build Coastguard Worker         // YYYYYYYY
757*35ffd701SAndroid Build Coastguard Worker         // UUUU
758*35ffd701SAndroid Build Coastguard Worker         // UUUU
759*35ffd701SAndroid Build Coastguard Worker         // UUUU
760*35ffd701SAndroid Build Coastguard Worker         // UUUU
761*35ffd701SAndroid Build Coastguard Worker         // VVVV
762*35ffd701SAndroid Build Coastguard Worker         // VVVV
763*35ffd701SAndroid Build Coastguard Worker         // VVVV
764*35ffd701SAndroid Build Coastguard Worker         // VVVV
765*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_BGRP:
766*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_RGBP:
767*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_MFX_JPEG_YUV444: // Similar to IMC3 but U/V are full size.
768*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
769*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
770*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
771*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
772*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
773*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
774*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
775*35ffd701SAndroid Build Coastguard Worker             // UUUUUUUU
776*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
777*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
778*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
779*35ffd701SAndroid Build Coastguard Worker             // VVVVVVVV
780*35ffd701SAndroid Build Coastguard Worker             {
781*35ffd701SAndroid Build Coastguard Worker                 YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
782*35ffd701SAndroid Build Coastguard Worker 
783*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
784*35ffd701SAndroid Build Coastguard Worker 
785*35ffd701SAndroid Build Coastguard Worker                 break;
786*35ffd701SAndroid Build Coastguard Worker             }
787*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC2: // IMC2 = IMC4 with Swapped U/V
788*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IMC4:
789*35ffd701SAndroid Build Coastguard Worker         {
790*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
791*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
792*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
793*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
794*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
795*35ffd701SAndroid Build Coastguard Worker             // UUUUVVVV
796*35ffd701SAndroid Build Coastguard Worker 
797*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT((Surf.Pitch & 1) == 0);
798*35ffd701SAndroid Build Coastguard Worker 
799*35ffd701SAndroid Build Coastguard Worker             YHeight = GFX_ALIGN(Surf.BaseHeight, GMM_IMCx_PLANE_ROW_ALIGNMENT);
800*35ffd701SAndroid Build Coastguard Worker 
801*35ffd701SAndroid Build Coastguard Worker             VHeight = GFX_CEIL_DIV(YHeight, 2);
802*35ffd701SAndroid Build Coastguard Worker 
803*35ffd701SAndroid Build Coastguard Worker             break;
804*35ffd701SAndroid Build Coastguard Worker         }
805*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_I420: // I420 = IYUV
806*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_IYUV: // I420/IYUV = YV12 with Swapped U/V
807*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YV12:
808*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_YVU9:
809*35ffd701SAndroid Build Coastguard Worker         {
810*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
811*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
812*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
813*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
814*35ffd701SAndroid Build Coastguard Worker             // VVVVVV..  <-- V and U planes follow the Y plane, as linear
815*35ffd701SAndroid Build Coastguard Worker             // ..UUUUUU      arrays--without respect to pitch.
816*35ffd701SAndroid Build Coastguard Worker 
817*35ffd701SAndroid Build Coastguard Worker             uint32_t YSize, YVSizeRShift, VSize, UOffset;
818*35ffd701SAndroid Build Coastguard Worker             uint32_t YSizeForUVPurposes, YSizeForUVPurposesDimensionalAlignment;
819*35ffd701SAndroid Build Coastguard Worker 
820*35ffd701SAndroid Build Coastguard Worker             YSize = GFX_ULONG_CAST(Surf.Pitch) * Surf.BaseHeight;
821*35ffd701SAndroid Build Coastguard Worker 
822*35ffd701SAndroid Build Coastguard Worker             // YVU9 has one U/V pixel for each 4x4 Y block.
823*35ffd701SAndroid Build Coastguard Worker             // The others have one U/V pixel for each 2x2 Y block.
824*35ffd701SAndroid Build Coastguard Worker 
825*35ffd701SAndroid Build Coastguard Worker             // YVU9 has a Y:V size ratio of 16 (4x4 --> 1).
826*35ffd701SAndroid Build Coastguard Worker             // The others have a ratio of 4 (2x2 --> 1).
827*35ffd701SAndroid Build Coastguard Worker             YVSizeRShift = (Surf.Format != GMM_FORMAT_YVU9) ? 2 : 4;
828*35ffd701SAndroid Build Coastguard Worker 
829*35ffd701SAndroid Build Coastguard Worker             // If a Y plane isn't fully-aligned to its Y-->U/V block size, the
830*35ffd701SAndroid Build Coastguard Worker             // extra/unaligned Y pixels still need corresponding U/V pixels--So
831*35ffd701SAndroid Build Coastguard Worker             // for the purpose of computing the UVSize, we must consider a
832*35ffd701SAndroid Build Coastguard Worker             // dimensionally "rounded-up" YSize. (E.g. a 13x5 YVU9 Y plane would
833*35ffd701SAndroid Build Coastguard Worker             // require 4x2 U/V planes--the same UVSize as a fully-aligned 16x8 Y.)
834*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposesDimensionalAlignment = (Surf.Format != GMM_FORMAT_YVU9) ? 2 : 4;
835*35ffd701SAndroid Build Coastguard Worker             YSizeForUVPurposes =
836*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(GFX_ULONG_CAST(Surf.Pitch), YSizeForUVPurposesDimensionalAlignment) *
837*35ffd701SAndroid Build Coastguard Worker             GFX_ALIGN(Surf.BaseHeight, YSizeForUVPurposesDimensionalAlignment);
838*35ffd701SAndroid Build Coastguard Worker 
839*35ffd701SAndroid Build Coastguard Worker             VSize = (YSizeForUVPurposes >> YVSizeRShift);
840*35ffd701SAndroid Build Coastguard Worker 
841*35ffd701SAndroid Build Coastguard Worker             YHeight = GFX_CEIL_DIV(YSize + 2 * VSize, WidthBytesPhysical);
842*35ffd701SAndroid Build Coastguard Worker 
843*35ffd701SAndroid Build Coastguard Worker             break;
844*35ffd701SAndroid Build Coastguard Worker         }
845*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV12:
846*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV21:
847*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_NV11:
848*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P010:
849*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P012:
850*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P016:
851*35ffd701SAndroid Build Coastguard Worker         case GMM_FORMAT_P208:
852*35ffd701SAndroid Build Coastguard Worker         {
853*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
854*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
855*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
856*35ffd701SAndroid Build Coastguard Worker             // YYYYYYYY
857*35ffd701SAndroid Build Coastguard Worker             // [UV-Packing]
858*35ffd701SAndroid Build Coastguard Worker             YHeight = GFX_ALIGN(Height, __GMM_EVEN_ROW);
859*35ffd701SAndroid Build Coastguard Worker 
860*35ffd701SAndroid Build Coastguard Worker             if((Surf.Format == GMM_FORMAT_NV12) ||
861*35ffd701SAndroid Build Coastguard Worker                (Surf.Format == GMM_FORMAT_NV21) ||
862*35ffd701SAndroid Build Coastguard Worker                (Surf.Format == GMM_FORMAT_P010) ||
863*35ffd701SAndroid Build Coastguard Worker                (Surf.Format == GMM_FORMAT_P012) ||
864*35ffd701SAndroid Build Coastguard Worker                (Surf.Format == GMM_FORMAT_P016))
865*35ffd701SAndroid Build Coastguard Worker             {
866*35ffd701SAndroid Build Coastguard Worker                 VHeight = GFX_CEIL_DIV(Height, 2);
867*35ffd701SAndroid Build Coastguard Worker             }
868*35ffd701SAndroid Build Coastguard Worker             else
869*35ffd701SAndroid Build Coastguard Worker             {
870*35ffd701SAndroid Build Coastguard Worker                 VHeight = YHeight; // U/V plane is same as Y
871*35ffd701SAndroid Build Coastguard Worker             }
872*35ffd701SAndroid Build Coastguard Worker 
873*35ffd701SAndroid Build Coastguard Worker             break;
874*35ffd701SAndroid Build Coastguard Worker         }
875*35ffd701SAndroid Build Coastguard Worker         default:
876*35ffd701SAndroid Build Coastguard Worker         {
877*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(0, "Unknown Video Format U\n");
878*35ffd701SAndroid Build Coastguard Worker             break;
879*35ffd701SAndroid Build Coastguard Worker         }
880*35ffd701SAndroid Build Coastguard Worker     }
881*35ffd701SAndroid Build Coastguard Worker 
882*35ffd701SAndroid Build Coastguard Worker     pTextureCalc->SetPlaneUnAlignedTexOffsetInfo(&Surf, YHeight, VHeight);
883*35ffd701SAndroid Build Coastguard Worker 
884*35ffd701SAndroid Build Coastguard Worker }
885*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
886*35ffd701SAndroid Build Coastguard Worker /// Returns downscaled width for fast clear of given subresource
887*35ffd701SAndroid Build Coastguard Worker /// @param[in]  uint32_t : MipLevel
888*35ffd701SAndroid Build Coastguard Worker /// @return     Width
889*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetFastClearWidth(uint32_t MipLevel)890*35ffd701SAndroid Build Coastguard Worker uint64_t GmmLib::GmmResourceInfoCommon::GetFastClearWidth(uint32_t MipLevel)
891*35ffd701SAndroid Build Coastguard Worker {
892*35ffd701SAndroid Build Coastguard Worker     uint64_t width      = 0;
893*35ffd701SAndroid Build Coastguard Worker     uint64_t mipWidth   = GetMipWidth(MipLevel);
894*35ffd701SAndroid Build Coastguard Worker     uint32_t numSamples = GetNumSamples();
895*35ffd701SAndroid Build Coastguard Worker 
896*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
897*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
898*35ffd701SAndroid Build Coastguard Worker 
899*35ffd701SAndroid Build Coastguard Worker     if(numSamples == 1)
900*35ffd701SAndroid Build Coastguard Worker     {
901*35ffd701SAndroid Build Coastguard Worker         width = pTextureCalc->ScaleFCRectWidth(&Surf, mipWidth);
902*35ffd701SAndroid Build Coastguard Worker     }
903*35ffd701SAndroid Build Coastguard Worker     else if(numSamples == 2 || numSamples == 4)
904*35ffd701SAndroid Build Coastguard Worker     {
905*35ffd701SAndroid Build Coastguard Worker         if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
906*35ffd701SAndroid Build Coastguard Worker         {
907*35ffd701SAndroid Build Coastguard Worker             width = GFX_ALIGN(mipWidth, 64) / 64;
908*35ffd701SAndroid Build Coastguard Worker         }
909*35ffd701SAndroid Build Coastguard Worker         else
910*35ffd701SAndroid Build Coastguard Worker         {
911*35ffd701SAndroid Build Coastguard Worker             width = GFX_ALIGN(mipWidth, 8) / 8;
912*35ffd701SAndroid Build Coastguard Worker         }
913*35ffd701SAndroid Build Coastguard Worker     }
914*35ffd701SAndroid Build Coastguard Worker     else if(numSamples == 8)
915*35ffd701SAndroid Build Coastguard Worker     {
916*35ffd701SAndroid Build Coastguard Worker         if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
917*35ffd701SAndroid Build Coastguard Worker         {
918*35ffd701SAndroid Build Coastguard Worker             width = GFX_ALIGN(mipWidth, 16) / 16;
919*35ffd701SAndroid Build Coastguard Worker         }
920*35ffd701SAndroid Build Coastguard Worker         else
921*35ffd701SAndroid Build Coastguard Worker         {
922*35ffd701SAndroid Build Coastguard Worker             width = GFX_ALIGN(mipWidth, 2) / 2;
923*35ffd701SAndroid Build Coastguard Worker         }
924*35ffd701SAndroid Build Coastguard Worker     }
925*35ffd701SAndroid Build Coastguard Worker     else // numSamples == 16
926*35ffd701SAndroid Build Coastguard Worker     {
927*35ffd701SAndroid Build Coastguard Worker         if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
928*35ffd701SAndroid Build Coastguard Worker         {
929*35ffd701SAndroid Build Coastguard Worker             width = GFX_ALIGN(mipWidth, 8) / 8;
930*35ffd701SAndroid Build Coastguard Worker         }
931*35ffd701SAndroid Build Coastguard Worker         else
932*35ffd701SAndroid Build Coastguard Worker         {
933*35ffd701SAndroid Build Coastguard Worker             width = mipWidth;
934*35ffd701SAndroid Build Coastguard Worker         }
935*35ffd701SAndroid Build Coastguard Worker     }
936*35ffd701SAndroid Build Coastguard Worker 
937*35ffd701SAndroid Build Coastguard Worker     return width;
938*35ffd701SAndroid Build Coastguard Worker }
939*35ffd701SAndroid Build Coastguard Worker 
940*35ffd701SAndroid Build Coastguard Worker 
941*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
942*35ffd701SAndroid Build Coastguard Worker /// Returns downscaled height for fast clear of given subresource
943*35ffd701SAndroid Build Coastguard Worker /// @param[in]  uint32_t : MipLevel
944*35ffd701SAndroid Build Coastguard Worker /// @return     height
945*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetFastClearHeight(uint32_t MipLevel)946*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmResourceInfoCommon::GetFastClearHeight(uint32_t MipLevel)
947*35ffd701SAndroid Build Coastguard Worker {
948*35ffd701SAndroid Build Coastguard Worker     uint32_t height     = 0;
949*35ffd701SAndroid Build Coastguard Worker     uint32_t mipHeight  = GetMipHeight(MipLevel);
950*35ffd701SAndroid Build Coastguard Worker     uint32_t numSamples = GetNumSamples();
951*35ffd701SAndroid Build Coastguard Worker 
952*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
953*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
954*35ffd701SAndroid Build Coastguard Worker 
955*35ffd701SAndroid Build Coastguard Worker     if(numSamples == 1)
956*35ffd701SAndroid Build Coastguard Worker     {
957*35ffd701SAndroid Build Coastguard Worker         height = pTextureCalc->ScaleFCRectHeight(&Surf, mipHeight);
958*35ffd701SAndroid Build Coastguard Worker     }
959*35ffd701SAndroid Build Coastguard Worker     else
960*35ffd701SAndroid Build Coastguard Worker     {
961*35ffd701SAndroid Build Coastguard Worker         if (GetGmmLibContext()->GetSkuTable().FtrXe2Compression)
962*35ffd701SAndroid Build Coastguard Worker         {
963*35ffd701SAndroid Build Coastguard Worker             height = GFX_ALIGN(mipHeight, 4) / 4;
964*35ffd701SAndroid Build Coastguard Worker         }
965*35ffd701SAndroid Build Coastguard Worker         else
966*35ffd701SAndroid Build Coastguard Worker         {
967*35ffd701SAndroid Build Coastguard Worker             height = GFX_ALIGN(mipHeight, 2) / 2;
968*35ffd701SAndroid Build Coastguard Worker         }
969*35ffd701SAndroid Build Coastguard Worker     }
970*35ffd701SAndroid Build Coastguard Worker 
971*35ffd701SAndroid Build Coastguard Worker     return height;
972*35ffd701SAndroid Build Coastguard Worker }
973*35ffd701SAndroid Build Coastguard Worker 
974*35ffd701SAndroid Build Coastguard Worker 
975*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
976*35ffd701SAndroid Build Coastguard Worker /// Returns 2D Surface width to be used for fast clear for a given 3D surface
977*35ffd701SAndroid Build Coastguard Worker /// @param[in]  uint32_t : MipLevel
978*35ffd701SAndroid Build Coastguard Worker /// @return     height
979*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Get2DFastClearSurfaceWidthFor3DSurface(uint32_t MipLevel)980*35ffd701SAndroid Build Coastguard Worker uint64_t GmmLib::GmmResourceInfoCommon::Get2DFastClearSurfaceWidthFor3DSurface(uint32_t MipLevel)
981*35ffd701SAndroid Build Coastguard Worker {
982*35ffd701SAndroid Build Coastguard Worker     uint64_t width    = 0;
983*35ffd701SAndroid Build Coastguard Worker     uint64_t mipWidth = GetMipWidth(MipLevel);
984*35ffd701SAndroid Build Coastguard Worker 
985*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
986*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
987*35ffd701SAndroid Build Coastguard Worker     width        = pTextureCalc->Get2DFCSurfaceWidthFor3DSurface(&Surf, mipWidth);
988*35ffd701SAndroid Build Coastguard Worker     return width;
989*35ffd701SAndroid Build Coastguard Worker }
990*35ffd701SAndroid Build Coastguard Worker 
991*35ffd701SAndroid Build Coastguard Worker 
Get2DFastClearSurfaceHeightFor3DSurface(uint32_t MipLevel)992*35ffd701SAndroid Build Coastguard Worker uint64_t GmmLib::GmmResourceInfoCommon::Get2DFastClearSurfaceHeightFor3DSurface(uint32_t MipLevel)
993*35ffd701SAndroid Build Coastguard Worker {
994*35ffd701SAndroid Build Coastguard Worker     uint64_t          height    = 0;
995*35ffd701SAndroid Build Coastguard Worker     uint32_t          mipHeight = GetMipHeight(MipLevel);
996*35ffd701SAndroid Build Coastguard Worker     uint32_t          mipDepth  = GetMipDepth(MipLevel);
997*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
998*35ffd701SAndroid Build Coastguard Worker 
999*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
1000*35ffd701SAndroid Build Coastguard Worker     height       = pTextureCalc->Get2DFCSurfaceHeightFor3DSurface(&Surf, mipHeight, mipDepth);
1001*35ffd701SAndroid Build Coastguard Worker     return height;
1002*35ffd701SAndroid Build Coastguard Worker }
1003*35ffd701SAndroid Build Coastguard Worker 
1004*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1005*35ffd701SAndroid Build Coastguard Worker /// Returns the Platform info.  If Platform has been overriden by the clients, then
1006*35ffd701SAndroid Build Coastguard Worker /// it returns the overriden Platform Info struct.
1007*35ffd701SAndroid Build Coastguard Worker /// @return     Reference to the relevent ::GMM_PLATFORM_INFO
1008*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetPlatformInfo()1009*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO &GmmLib::GmmResourceInfoCommon::GetPlatformInfo()
1010*35ffd701SAndroid Build Coastguard Worker {
1011*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__) && (_DEBUG || _RELEASE_INTERNAL))
1012*35ffd701SAndroid Build Coastguard Worker     if(GFX_GET_CURRENT_RENDERCORE(Surf.Platform) != GFX_GET_CURRENT_RENDERCORE(((Context *)pGmmKmdLibContext)->GetPlatformInfo().Platform))
1013*35ffd701SAndroid Build Coastguard Worker     {
1014*35ffd701SAndroid Build Coastguard Worker         return ((Context *)pGmmKmdLibContext)->GetOverridePlatformInfo();
1015*35ffd701SAndroid Build Coastguard Worker     }
1016*35ffd701SAndroid Build Coastguard Worker     else
1017*35ffd701SAndroid Build Coastguard Worker     {
1018*35ffd701SAndroid Build Coastguard Worker         return ((Context *)pGmmKmdLibContext)->GetPlatformInfo();
1019*35ffd701SAndroid Build Coastguard Worker     }
1020*35ffd701SAndroid Build Coastguard Worker #else
1021*35ffd701SAndroid Build Coastguard Worker     return ((Context *)pGmmUmdLibContext)->GetPlatformInfo();
1022*35ffd701SAndroid Build Coastguard Worker #endif
1023*35ffd701SAndroid Build Coastguard Worker }
1024*35ffd701SAndroid Build Coastguard Worker 
1025*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1026*35ffd701SAndroid Build Coastguard Worker /// Returns width padded to HAlign. Only called for special flags. See asserts in
1027*35ffd701SAndroid Build Coastguard Worker /// function for which surfaces are supported.
1028*35ffd701SAndroid Build Coastguard Worker ///
1029*35ffd701SAndroid Build Coastguard Worker /// @param[in]  MipLevel Mip level for which the width is requested
1030*35ffd701SAndroid Build Coastguard Worker /// @return     Padded Width
1031*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetPaddedWidth(uint32_t MipLevel)1032*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetPaddedWidth(uint32_t MipLevel)
1033*35ffd701SAndroid Build Coastguard Worker {
1034*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
1035*35ffd701SAndroid Build Coastguard Worker     uint32_t          AlignedWidth;
1036*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T    MipWidth;
1037*35ffd701SAndroid Build Coastguard Worker     uint32_t          HAlign;
1038*35ffd701SAndroid Build Coastguard Worker 
1039*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(MipLevel <= Surf.MaxLod);
1040*35ffd701SAndroid Build Coastguard Worker 
1041*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
1042*35ffd701SAndroid Build Coastguard Worker 
1043*35ffd701SAndroid Build Coastguard Worker     // This shall be called for Depth and Separate Stencil main surface resource
1044*35ffd701SAndroid Build Coastguard Worker     // This shall be called for the Aux surfaces (MCS, CCS and Hiz) too.
1045*35ffd701SAndroid Build Coastguard Worker     // MCS will have Surf.Flags.Gpu.CCS set
1046*35ffd701SAndroid Build Coastguard Worker     // Hiz will have Surf.Flags.Gpu.HiZ set
1047*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(Surf.Flags.Gpu.Depth || Surf.Flags.Gpu.SeparateStencil ||
1048*35ffd701SAndroid Build Coastguard Worker                  Surf.Flags.Gpu.CCS || Surf.Flags.Gpu.HiZ ||
1049*35ffd701SAndroid Build Coastguard Worker                  AuxSurf.Flags.Gpu.__MsaaTileMcs ||
1050*35ffd701SAndroid Build Coastguard Worker                  AuxSurf.Flags.Gpu.CCS || AuxSurf.Flags.Gpu.__NonMsaaTileYCcs);
1051*35ffd701SAndroid Build Coastguard Worker 
1052*35ffd701SAndroid Build Coastguard Worker     MipWidth = pTextureCalc->GmmTexGetMipWidth(&Surf, MipLevel);
1053*35ffd701SAndroid Build Coastguard Worker 
1054*35ffd701SAndroid Build Coastguard Worker     HAlign = Surf.Alignment.HAlign;
1055*35ffd701SAndroid Build Coastguard Worker     if(AuxSurf.Flags.Gpu.CCS && AuxSurf.Flags.Gpu.__NonMsaaTileYCcs)
1056*35ffd701SAndroid Build Coastguard Worker     {
1057*35ffd701SAndroid Build Coastguard Worker         HAlign = AuxSurf.Alignment.HAlign;
1058*35ffd701SAndroid Build Coastguard Worker     }
1059*35ffd701SAndroid Build Coastguard Worker 
1060*35ffd701SAndroid Build Coastguard Worker     AlignedWidth = __GMM_EXPAND_WIDTH(pTextureCalc,
1061*35ffd701SAndroid Build Coastguard Worker                                       GFX_ULONG_CAST(MipWidth),
1062*35ffd701SAndroid Build Coastguard Worker                                       HAlign,
1063*35ffd701SAndroid Build Coastguard Worker                                       &Surf);
1064*35ffd701SAndroid Build Coastguard Worker 
1065*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.SeparateStencil)
1066*35ffd701SAndroid Build Coastguard Worker     {
1067*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Info.TiledW)
1068*35ffd701SAndroid Build Coastguard Worker         {
1069*35ffd701SAndroid Build Coastguard Worker             AlignedWidth *= 2;
1070*35ffd701SAndroid Build Coastguard Worker         }
1071*35ffd701SAndroid Build Coastguard Worker 
1072*35ffd701SAndroid Build Coastguard Worker         // Reverse MSAA Expansion ////////////////////////////////////////////////
1073*35ffd701SAndroid Build Coastguard Worker         // It might seem strange that we ExpandWidth (with consideration for MSAA)
1074*35ffd701SAndroid Build Coastguard Worker         // only to "reverse" the MSAA portion of the expansion...It's an order-of-
1075*35ffd701SAndroid Build Coastguard Worker         // operations thing--The intention of the reversal isn't to have
1076*35ffd701SAndroid Build Coastguard Worker         // disregarded the original MSAA expansion but to produce a width, that
1077*35ffd701SAndroid Build Coastguard Worker         // when MSAA'ed will match the true physical width (which requires MSAA
1078*35ffd701SAndroid Build Coastguard Worker         // consideration to compute).
1079*35ffd701SAndroid Build Coastguard Worker         switch(Surf.MSAA.NumSamples)
1080*35ffd701SAndroid Build Coastguard Worker         {
1081*35ffd701SAndroid Build Coastguard Worker             case 1:
1082*35ffd701SAndroid Build Coastguard Worker                 break;
1083*35ffd701SAndroid Build Coastguard Worker             case 2: // Same as 4x...
1084*35ffd701SAndroid Build Coastguard Worker             case 4:
1085*35ffd701SAndroid Build Coastguard Worker                 AlignedWidth /= 2;
1086*35ffd701SAndroid Build Coastguard Worker                 break;
1087*35ffd701SAndroid Build Coastguard Worker             case 8: // Same as 16x...
1088*35ffd701SAndroid Build Coastguard Worker             case 16:
1089*35ffd701SAndroid Build Coastguard Worker                 AlignedWidth /= 4;
1090*35ffd701SAndroid Build Coastguard Worker                 break;
1091*35ffd701SAndroid Build Coastguard Worker             default:
1092*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(0);
1093*35ffd701SAndroid Build Coastguard Worker         }
1094*35ffd701SAndroid Build Coastguard Worker     }
1095*35ffd701SAndroid Build Coastguard Worker 
1096*35ffd701SAndroid Build Coastguard Worker     // CCS Aux surface, Aligned width needs to be scaled based on main surface bpp
1097*35ffd701SAndroid Build Coastguard Worker     if(AuxSurf.Flags.Gpu.CCS && AuxSurf.Flags.Gpu.__NonMsaaTileYCcs)
1098*35ffd701SAndroid Build Coastguard Worker     {
1099*35ffd701SAndroid Build Coastguard Worker         AlignedWidth = pTextureCalc->ScaleTextureWidth(&AuxSurf, AlignedWidth);
1100*35ffd701SAndroid Build Coastguard Worker     }
1101*35ffd701SAndroid Build Coastguard Worker 
1102*35ffd701SAndroid Build Coastguard Worker     return AlignedWidth;
1103*35ffd701SAndroid Build Coastguard Worker }
1104*35ffd701SAndroid Build Coastguard Worker 
1105*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1106*35ffd701SAndroid Build Coastguard Worker /// Returns height padded to VAlign. Only called for special flags. See asserts in
1107*35ffd701SAndroid Build Coastguard Worker /// function for which surfaces are supported.
1108*35ffd701SAndroid Build Coastguard Worker ///
1109*35ffd701SAndroid Build Coastguard Worker /// @param[in]  MipLevel Mip level for which the height is requested
1110*35ffd701SAndroid Build Coastguard Worker /// @return     Padded height
1111*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetPaddedHeight(uint32_t MipLevel)1112*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetPaddedHeight(uint32_t MipLevel)
1113*35ffd701SAndroid Build Coastguard Worker {
1114*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
1115*35ffd701SAndroid Build Coastguard Worker     uint32_t          AlignedHeight, MipHeight;
1116*35ffd701SAndroid Build Coastguard Worker     uint32_t          VAlign;
1117*35ffd701SAndroid Build Coastguard Worker 
1118*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(MipLevel <= Surf.MaxLod);
1119*35ffd701SAndroid Build Coastguard Worker 
1120*35ffd701SAndroid Build Coastguard Worker     // See note in GmmResGetPaddedWidth.
1121*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(Surf.Flags.Gpu.Depth || Surf.Flags.Gpu.SeparateStencil ||
1122*35ffd701SAndroid Build Coastguard Worker                  Surf.Flags.Gpu.CCS || Surf.Flags.Gpu.HiZ ||
1123*35ffd701SAndroid Build Coastguard Worker                  AuxSurf.Flags.Gpu.__MsaaTileMcs ||
1124*35ffd701SAndroid Build Coastguard Worker                  AuxSurf.Flags.Gpu.CCS || AuxSurf.Flags.Gpu.__NonMsaaTileYCcs);
1125*35ffd701SAndroid Build Coastguard Worker 
1126*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
1127*35ffd701SAndroid Build Coastguard Worker 
1128*35ffd701SAndroid Build Coastguard Worker     MipHeight = pTextureCalc->GmmTexGetMipHeight(&Surf, MipLevel);
1129*35ffd701SAndroid Build Coastguard Worker 
1130*35ffd701SAndroid Build Coastguard Worker     VAlign = Surf.Alignment.VAlign;
1131*35ffd701SAndroid Build Coastguard Worker     if(AuxSurf.Flags.Gpu.CCS && AuxSurf.Flags.Gpu.__NonMsaaTileYCcs)
1132*35ffd701SAndroid Build Coastguard Worker     {
1133*35ffd701SAndroid Build Coastguard Worker         VAlign = AuxSurf.Alignment.VAlign;
1134*35ffd701SAndroid Build Coastguard Worker     }
1135*35ffd701SAndroid Build Coastguard Worker 
1136*35ffd701SAndroid Build Coastguard Worker     AlignedHeight = __GMM_EXPAND_HEIGHT(pTextureCalc,
1137*35ffd701SAndroid Build Coastguard Worker                                         MipHeight,
1138*35ffd701SAndroid Build Coastguard Worker                                         VAlign,
1139*35ffd701SAndroid Build Coastguard Worker                                         &Surf);
1140*35ffd701SAndroid Build Coastguard Worker 
1141*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Gpu.SeparateStencil)
1142*35ffd701SAndroid Build Coastguard Worker     {
1143*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Info.TiledW)
1144*35ffd701SAndroid Build Coastguard Worker         {
1145*35ffd701SAndroid Build Coastguard Worker             AlignedHeight /= 2;
1146*35ffd701SAndroid Build Coastguard Worker         }
1147*35ffd701SAndroid Build Coastguard Worker 
1148*35ffd701SAndroid Build Coastguard Worker         // Reverse MSAA Expansion ////////////////////////////////////////////////
1149*35ffd701SAndroid Build Coastguard Worker         // See note in GmmResGetPaddedWidth.
1150*35ffd701SAndroid Build Coastguard Worker         switch(Surf.MSAA.NumSamples)
1151*35ffd701SAndroid Build Coastguard Worker         {
1152*35ffd701SAndroid Build Coastguard Worker             case 1:
1153*35ffd701SAndroid Build Coastguard Worker                 break;
1154*35ffd701SAndroid Build Coastguard Worker             case 2:
1155*35ffd701SAndroid Build Coastguard Worker                 break; // No height adjustment for 2x...
1156*35ffd701SAndroid Build Coastguard Worker             case 4:    // Same as 8x...
1157*35ffd701SAndroid Build Coastguard Worker             case 8:
1158*35ffd701SAndroid Build Coastguard Worker                 AlignedHeight /= 2;
1159*35ffd701SAndroid Build Coastguard Worker                 break;
1160*35ffd701SAndroid Build Coastguard Worker             case 16:
1161*35ffd701SAndroid Build Coastguard Worker                 AlignedHeight /= 4;
1162*35ffd701SAndroid Build Coastguard Worker                 break;
1163*35ffd701SAndroid Build Coastguard Worker             default:
1164*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(0);
1165*35ffd701SAndroid Build Coastguard Worker         }
1166*35ffd701SAndroid Build Coastguard Worker     }
1167*35ffd701SAndroid Build Coastguard Worker 
1168*35ffd701SAndroid Build Coastguard Worker     // CCS Aux surface, AlignedHeight needs to be scaled by 16
1169*35ffd701SAndroid Build Coastguard Worker     if(AuxSurf.Flags.Gpu.CCS && AuxSurf.Flags.Gpu.__NonMsaaTileYCcs)
1170*35ffd701SAndroid Build Coastguard Worker     {
1171*35ffd701SAndroid Build Coastguard Worker         AlignedHeight = pTextureCalc->ScaleTextureHeight(&AuxSurf, AlignedHeight);
1172*35ffd701SAndroid Build Coastguard Worker     }
1173*35ffd701SAndroid Build Coastguard Worker 
1174*35ffd701SAndroid Build Coastguard Worker     return AlignedHeight;
1175*35ffd701SAndroid Build Coastguard Worker }
1176*35ffd701SAndroid Build Coastguard Worker 
1177*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1178*35ffd701SAndroid Build Coastguard Worker /// Returns pitch padded to VAlign. Only called for special flags. See asserts in
1179*35ffd701SAndroid Build Coastguard Worker /// function for which surfaces are supported.
1180*35ffd701SAndroid Build Coastguard Worker ///
1181*35ffd701SAndroid Build Coastguard Worker /// @param[in]  MipLevel Mip level for which the pitch is requested
1182*35ffd701SAndroid Build Coastguard Worker /// @return     Padded pitch
1183*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetPaddedPitch(uint32_t MipLevel)1184*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetPaddedPitch(uint32_t MipLevel)
1185*35ffd701SAndroid Build Coastguard Worker {
1186*35ffd701SAndroid Build Coastguard Worker     uint32_t AlignedWidth;
1187*35ffd701SAndroid Build Coastguard Worker     uint32_t AlignedPitch;
1188*35ffd701SAndroid Build Coastguard Worker     uint32_t BitsPerPixel;
1189*35ffd701SAndroid Build Coastguard Worker 
1190*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(MipLevel <= Surf.MaxLod);
1191*35ffd701SAndroid Build Coastguard Worker 
1192*35ffd701SAndroid Build Coastguard Worker     // See note in GetPaddedWidth.
1193*35ffd701SAndroid Build Coastguard Worker     AlignedWidth = GetPaddedWidth(MipLevel);
1194*35ffd701SAndroid Build Coastguard Worker 
1195*35ffd701SAndroid Build Coastguard Worker     BitsPerPixel = Surf.BitsPerPixel;
1196*35ffd701SAndroid Build Coastguard Worker     if(AuxSurf.Flags.Gpu.CCS && AuxSurf.Flags.Gpu.__NonMsaaTileYCcs)
1197*35ffd701SAndroid Build Coastguard Worker     {
1198*35ffd701SAndroid Build Coastguard Worker         BitsPerPixel = 8; //Aux surface are 8bpp
1199*35ffd701SAndroid Build Coastguard Worker     }
1200*35ffd701SAndroid Build Coastguard Worker 
1201*35ffd701SAndroid Build Coastguard Worker     AlignedPitch = AlignedWidth * BitsPerPixel >> 3;
1202*35ffd701SAndroid Build Coastguard Worker 
1203*35ffd701SAndroid Build Coastguard Worker     return AlignedPitch;
1204*35ffd701SAndroid Build Coastguard Worker }
1205*35ffd701SAndroid Build Coastguard Worker 
1206*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1207*35ffd701SAndroid Build Coastguard Worker /// Returns resource's QPitch.
1208*35ffd701SAndroid Build Coastguard Worker ///
1209*35ffd701SAndroid Build Coastguard Worker /// @return     QPitch
1210*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetQPitch()1211*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetQPitch()
1212*35ffd701SAndroid Build Coastguard Worker {
1213*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
1214*35ffd701SAndroid Build Coastguard Worker     uint32_t                 QPitch;
1215*35ffd701SAndroid Build Coastguard Worker 
1216*35ffd701SAndroid Build Coastguard Worker     pPlatform = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
1217*35ffd701SAndroid Build Coastguard Worker 
1218*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN8_CORE);
1219*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT((Surf.Type != RESOURCE_3D) ||
1220*35ffd701SAndroid Build Coastguard Worker                  (GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN9_CORE));
1221*35ffd701SAndroid Build Coastguard Worker 
1222*35ffd701SAndroid Build Coastguard Worker     // 2D/CUBE    ==> distance in rows between array slices
1223*35ffd701SAndroid Build Coastguard Worker     // 3D         ==> distance in rows between R-slices
1224*35ffd701SAndroid Build Coastguard Worker     // Compressed ==> one row contains a complete compression block vertically
1225*35ffd701SAndroid Build Coastguard Worker     // HiZ        ==> HZ_PxPerByte * HZ_QPitch
1226*35ffd701SAndroid Build Coastguard Worker     // Stencil    ==> logical, i.e. not halved
1227*35ffd701SAndroid Build Coastguard Worker 
1228*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_RENDERCORE(pPlatform->Platform) >= IGFX_GEN9_CORE) &&
1229*35ffd701SAndroid Build Coastguard Worker        GmmIsCompressed(GetGmmLibContext(), Surf.Format))
1230*35ffd701SAndroid Build Coastguard Worker     {
1231*35ffd701SAndroid Build Coastguard Worker         QPitch = Surf.Alignment.QPitch / GetCompressionBlockHeight();
1232*35ffd701SAndroid Build Coastguard Worker 
1233*35ffd701SAndroid Build Coastguard Worker         if((Surf.Type == RESOURCE_3D) && !Surf.Flags.Info.Linear)
1234*35ffd701SAndroid Build Coastguard Worker         {
1235*35ffd701SAndroid Build Coastguard Worker             const GMM_TILE_MODE TileMode = Surf.TileMode;
1236*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(TileMode < GMM_TILE_MODES);
1237*35ffd701SAndroid Build Coastguard Worker             QPitch = GFX_ALIGN(QPitch, pPlatform->TileInfo[TileMode].LogicalTileHeight);
1238*35ffd701SAndroid Build Coastguard Worker         }
1239*35ffd701SAndroid Build Coastguard Worker     }
1240*35ffd701SAndroid Build Coastguard Worker     else if(Surf.Flags.Gpu.HiZ)
1241*35ffd701SAndroid Build Coastguard Worker     {
1242*35ffd701SAndroid Build Coastguard Worker         QPitch = Surf.Alignment.QPitch * pPlatform->HiZPixelsPerByte;
1243*35ffd701SAndroid Build Coastguard Worker     }
1244*35ffd701SAndroid Build Coastguard Worker     else
1245*35ffd701SAndroid Build Coastguard Worker     {
1246*35ffd701SAndroid Build Coastguard Worker         QPitch = Surf.Alignment.QPitch;
1247*35ffd701SAndroid Build Coastguard Worker     }
1248*35ffd701SAndroid Build Coastguard Worker 
1249*35ffd701SAndroid Build Coastguard Worker     return QPitch;
1250*35ffd701SAndroid Build Coastguard Worker }
1251*35ffd701SAndroid Build Coastguard Worker 
1252*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1253*35ffd701SAndroid Build Coastguard Worker /// Returns offset information to a particular mip map or plane.
1254*35ffd701SAndroid Build Coastguard Worker ///
1255*35ffd701SAndroid Build Coastguard Worker /// @param[in][out] Has info about which offset client is requesting. Offset is also
1256*35ffd701SAndroid Build Coastguard Worker ///                 passed back to the client in this parameter.
1257*35ffd701SAndroid Build Coastguard Worker /// @return         ::GMM_STATUS
1258*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetOffset(GMM_REQ_OFFSET_INFO & ReqInfo)1259*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetOffset(GMM_REQ_OFFSET_INFO &ReqInfo)
1260*35ffd701SAndroid Build Coastguard Worker {
1261*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc;
1262*35ffd701SAndroid Build Coastguard Worker 
1263*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
1264*35ffd701SAndroid Build Coastguard Worker 
1265*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT((pTextureCalc != NULL));
1266*35ffd701SAndroid Build Coastguard Worker 
1267*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Info.RedecribedPlanes)
1268*35ffd701SAndroid Build Coastguard Worker     {
1269*35ffd701SAndroid Build Coastguard Worker         uint8_t RestoreReqStdLayout = ReqInfo.ReqStdLayout ? 1 : 0;
1270*35ffd701SAndroid Build Coastguard Worker 
1271*35ffd701SAndroid Build Coastguard Worker         // Lock and Render offsets do not require additional handling
1272*35ffd701SAndroid Build Coastguard Worker         if(ReqInfo.ReqLock || ReqInfo.ReqRender)
1273*35ffd701SAndroid Build Coastguard Worker         {
1274*35ffd701SAndroid Build Coastguard Worker             ReqInfo.ReqStdLayout = 0;
1275*35ffd701SAndroid Build Coastguard Worker             GmmTexGetMipMapOffset(&Surf, &ReqInfo, GetGmmLibContext());
1276*35ffd701SAndroid Build Coastguard Worker             ReqInfo.ReqStdLayout = RestoreReqStdLayout;
1277*35ffd701SAndroid Build Coastguard Worker         }
1278*35ffd701SAndroid Build Coastguard Worker 
1279*35ffd701SAndroid Build Coastguard Worker         if(ReqInfo.ReqStdLayout)
1280*35ffd701SAndroid Build Coastguard Worker         {
1281*35ffd701SAndroid Build Coastguard Worker             GMM_REQ_OFFSET_INFO TempReqInfo[GMM_MAX_PLANE] = {0};
1282*35ffd701SAndroid Build Coastguard Worker 	    GMM_TEXTURE_INFO    TexInfo[GMM_MAX_PLANE];
1283*35ffd701SAndroid Build Coastguard Worker             uint32_t            Plane, TotalPlanes = GmmLib::Utility::GmmGetNumPlanes(Surf.Format);
1284*35ffd701SAndroid Build Coastguard Worker 
1285*35ffd701SAndroid Build Coastguard Worker             // Caller must specify which plane they need the offset into if not
1286*35ffd701SAndroid Build Coastguard Worker             // getting the whole surface size
1287*35ffd701SAndroid Build Coastguard Worker             if(ReqInfo.Plane >= GMM_MAX_PLANE ||
1288*35ffd701SAndroid Build Coastguard Worker                (ReqInfo.StdLayout.Offset != -1 && !ReqInfo.Plane))
1289*35ffd701SAndroid Build Coastguard Worker             {
1290*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(0);
1291*35ffd701SAndroid Build Coastguard Worker                 return GMM_ERROR;
1292*35ffd701SAndroid Build Coastguard Worker             }
1293*35ffd701SAndroid Build Coastguard Worker 
1294*35ffd701SAndroid Build Coastguard Worker             TempReqInfo[GMM_PLANE_Y]         = *&ReqInfo;
1295*35ffd701SAndroid Build Coastguard Worker             TempReqInfo[GMM_PLANE_Y].Plane   = GMM_NO_PLANE;
1296*35ffd701SAndroid Build Coastguard Worker             TempReqInfo[GMM_PLANE_Y].ReqLock = TempReqInfo[GMM_PLANE_Y].ReqRender = 0;
1297*35ffd701SAndroid Build Coastguard Worker 
1298*35ffd701SAndroid Build Coastguard Worker             TempReqInfo[GMM_PLANE_V] = TempReqInfo[GMM_PLANE_U] = TempReqInfo[GMM_PLANE_Y];
1299*35ffd701SAndroid Build Coastguard Worker 
1300*35ffd701SAndroid Build Coastguard Worker 	    pTextureCalc->GetRedescribedPlaneParams(&Surf, GMM_PLANE_Y, &TexInfo[GMM_PLANE_Y]);
1301*35ffd701SAndroid Build Coastguard Worker             pTextureCalc->GetRedescribedPlaneParams(&Surf, GMM_PLANE_U, &TexInfo[GMM_PLANE_U]);
1302*35ffd701SAndroid Build Coastguard Worker             pTextureCalc->GetRedescribedPlaneParams(&Surf, GMM_PLANE_V, &TexInfo[GMM_PLANE_V]);
1303*35ffd701SAndroid Build Coastguard Worker 
1304*35ffd701SAndroid Build Coastguard Worker             if(GMM_SUCCESS != GmmTexGetMipMapOffset(&TexInfo[GMM_PLANE_Y], &TempReqInfo[GMM_PLANE_Y], GetGmmLibContext()) ||
1305*35ffd701SAndroid Build Coastguard Worker                GMM_SUCCESS != GmmTexGetMipMapOffset(&TexInfo[GMM_PLANE_U], &TempReqInfo[GMM_PLANE_U], GetGmmLibContext()) ||
1306*35ffd701SAndroid Build Coastguard Worker                GMM_SUCCESS != GmmTexGetMipMapOffset(&TexInfo[GMM_PLANE_V], &TempReqInfo[GMM_PLANE_V], GetGmmLibContext()))
1307*35ffd701SAndroid Build Coastguard Worker 	    {
1308*35ffd701SAndroid Build Coastguard Worker     		    __GMM_ASSERT(0);
1309*35ffd701SAndroid Build Coastguard Worker                 return GMM_ERROR;
1310*35ffd701SAndroid Build Coastguard Worker             }
1311*35ffd701SAndroid Build Coastguard Worker 
1312*35ffd701SAndroid Build Coastguard Worker             ReqInfo.StdLayout.TileDepthPitch = TempReqInfo[ReqInfo.Plane].StdLayout.TileDepthPitch;
1313*35ffd701SAndroid Build Coastguard Worker             ReqInfo.StdLayout.TileRowPitch   = TempReqInfo[ReqInfo.Plane].StdLayout.TileRowPitch;
1314*35ffd701SAndroid Build Coastguard Worker 
1315*35ffd701SAndroid Build Coastguard Worker             if(ReqInfo.StdLayout.Offset == -1)
1316*35ffd701SAndroid Build Coastguard Worker             {
1317*35ffd701SAndroid Build Coastguard Worker                 // Special request to get the StdLayout size
1318*35ffd701SAndroid Build Coastguard Worker                 ReqInfo.StdLayout.Offset = TempReqInfo[ReqInfo.Plane].StdLayout.Offset;
1319*35ffd701SAndroid Build Coastguard Worker 
1320*35ffd701SAndroid Build Coastguard Worker                 if(!ReqInfo.Plane)
1321*35ffd701SAndroid Build Coastguard Worker                 {
1322*35ffd701SAndroid Build Coastguard Worker                     for(Plane = GMM_PLANE_Y; Plane <= TotalPlanes; Plane++)
1323*35ffd701SAndroid Build Coastguard Worker                     {
1324*35ffd701SAndroid Build Coastguard Worker                         ReqInfo.StdLayout.Offset += TempReqInfo[Plane].StdLayout.Offset;
1325*35ffd701SAndroid Build Coastguard Worker                     }
1326*35ffd701SAndroid Build Coastguard Worker                 }
1327*35ffd701SAndroid Build Coastguard Worker             }
1328*35ffd701SAndroid Build Coastguard Worker             else
1329*35ffd701SAndroid Build Coastguard Worker             {
1330*35ffd701SAndroid Build Coastguard Worker                 ReqInfo.StdLayout.Offset = TempReqInfo[ReqInfo.Plane].StdLayout.Offset;
1331*35ffd701SAndroid Build Coastguard Worker 
1332*35ffd701SAndroid Build Coastguard Worker                 for(Plane = GMM_PLANE_Y; Plane < (uint32_t)ReqInfo.Plane; Plane++)
1333*35ffd701SAndroid Build Coastguard Worker                 {
1334*35ffd701SAndroid Build Coastguard Worker                     // Find the size of the previous planes and add it to the offset
1335*35ffd701SAndroid Build Coastguard Worker                     TempReqInfo[Plane].StdLayout.Offset = -1;
1336*35ffd701SAndroid Build Coastguard Worker 
1337*35ffd701SAndroid Build Coastguard Worker                     if(GMM_SUCCESS != GmmTexGetMipMapOffset(&TexInfo[Plane], &TempReqInfo[Plane], GetGmmLibContext()))
1338*35ffd701SAndroid Build Coastguard Worker                     {
1339*35ffd701SAndroid Build Coastguard Worker 
1340*35ffd701SAndroid Build Coastguard Worker                         __GMM_ASSERT(0);
1341*35ffd701SAndroid Build Coastguard Worker                         return GMM_ERROR;
1342*35ffd701SAndroid Build Coastguard Worker                     }
1343*35ffd701SAndroid Build Coastguard Worker 
1344*35ffd701SAndroid Build Coastguard Worker                     ReqInfo.StdLayout.Offset += TempReqInfo[Plane].StdLayout.Offset;
1345*35ffd701SAndroid Build Coastguard Worker                 }
1346*35ffd701SAndroid Build Coastguard Worker             }
1347*35ffd701SAndroid Build Coastguard Worker         }
1348*35ffd701SAndroid Build Coastguard Worker 
1349*35ffd701SAndroid Build Coastguard Worker         return GMM_SUCCESS;
1350*35ffd701SAndroid Build Coastguard Worker     }
1351*35ffd701SAndroid Build Coastguard Worker     else
1352*35ffd701SAndroid Build Coastguard Worker     {
1353*35ffd701SAndroid Build Coastguard Worker         return GmmTexGetMipMapOffset(&Surf, &ReqInfo, GetGmmLibContext());
1354*35ffd701SAndroid Build Coastguard Worker     }
1355*35ffd701SAndroid Build Coastguard Worker }
1356*35ffd701SAndroid Build Coastguard Worker 
1357*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1358*35ffd701SAndroid Build Coastguard Worker /// Performs a CPU BLT between a specified GPU resource and a system memory surface,
1359*35ffd701SAndroid Build Coastguard Worker /// as defined by the GMM_RES_COPY_BLT descriptor.
1360*35ffd701SAndroid Build Coastguard Worker ///
1361*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pBlt: Describes the blit operation. See ::GMM_RES_COPY_BLT for more info.
1362*35ffd701SAndroid Build Coastguard Worker /// @return     1 if succeeded, 0 otherwise
1363*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CpuBlt(GMM_RES_COPY_BLT * pBlt)1364*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::CpuBlt(GMM_RES_COPY_BLT *pBlt)
1365*35ffd701SAndroid Build Coastguard Worker {
1366*35ffd701SAndroid Build Coastguard Worker #define REQUIRE(e)       \
1367*35ffd701SAndroid Build Coastguard Worker     if(!(e))             \
1368*35ffd701SAndroid Build Coastguard Worker     {                    \
1369*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(0); \
1370*35ffd701SAndroid Build Coastguard Worker         Success = 0;     \
1371*35ffd701SAndroid Build Coastguard Worker         goto EXIT;       \
1372*35ffd701SAndroid Build Coastguard Worker     }
1373*35ffd701SAndroid Build Coastguard Worker 
1374*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
1375*35ffd701SAndroid Build Coastguard Worker     uint8_t                  Success = 1;
1376*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_INFO *       pTexInfo;
1377*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *       pTextureCalc;
1378*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_INFO         RedescribedPlaneInfo;
1379*35ffd701SAndroid Build Coastguard Worker 
1380*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pBlt, 0);
1381*35ffd701SAndroid Build Coastguard Worker 
1382*35ffd701SAndroid Build Coastguard Worker     pPlatform    = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
1383*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
1384*35ffd701SAndroid Build Coastguard Worker 
1385*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(
1386*35ffd701SAndroid Build Coastguard Worker     Surf.Type == RESOURCE_1D ||
1387*35ffd701SAndroid Build Coastguard Worker     Surf.Type == RESOURCE_2D ||
1388*35ffd701SAndroid Build Coastguard Worker     Surf.Type == RESOURCE_PRIMARY ||
1389*35ffd701SAndroid Build Coastguard Worker     Surf.Type == RESOURCE_CUBE ||
1390*35ffd701SAndroid Build Coastguard Worker     Surf.Type == RESOURCE_3D);
1391*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pBlt->Gpu.MipLevel <= Surf.MaxLod);
1392*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(Surf.MSAA.NumSamples <= 1);                          // Supported by CpuSwizzleBlt--but not yet this function.
1393*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(!Surf.Flags.Gpu.Depth || Surf.MSAA.NumSamples <= 1); // MSAA depth currently ends up with a few exchange swizzles--CpuSwizzleBlt could support with expanded XOR'ing, but probably no use case.
1394*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(!(
1395*35ffd701SAndroid Build Coastguard Worker     pBlt->Blt.Upload &&
1396*35ffd701SAndroid Build Coastguard Worker     Surf.Flags.Gpu.Depth &&
1397*35ffd701SAndroid Build Coastguard Worker     (Surf.BitsPerPixel == 32) &&
1398*35ffd701SAndroid Build Coastguard Worker     (pBlt->Sys.PixelPitch == 4) &&
1399*35ffd701SAndroid Build Coastguard Worker     (pBlt->Blt.BytesPerPixel == 3))); // When uploading D24 data from D24S8 to D24X8, no harm in copying S8 to X8 and upload will then be faster.
1400*35ffd701SAndroid Build Coastguard Worker 
1401*35ffd701SAndroid Build Coastguard Worker     pTexInfo = &(Surf);
1402*35ffd701SAndroid Build Coastguard Worker 
1403*35ffd701SAndroid Build Coastguard Worker     // YUV Planar surface
1404*35ffd701SAndroid Build Coastguard Worker     if(pTextureCalc->IsTileAlignedPlanes(pTexInfo) && GmmIsPlanar(Surf.Format))
1405*35ffd701SAndroid Build Coastguard Worker     {
1406*35ffd701SAndroid Build Coastguard Worker         uint32_t PlaneId = GMM_NO_PLANE;
1407*35ffd701SAndroid Build Coastguard Worker 
1408*35ffd701SAndroid Build Coastguard Worker 	pTextureCalc->GetPlaneIdForCpuBlt(pTexInfo, pBlt, &PlaneId);
1409*35ffd701SAndroid Build Coastguard Worker 
1410*35ffd701SAndroid Build Coastguard Worker 	if(PlaneId == GMM_MAX_PLANE)
1411*35ffd701SAndroid Build Coastguard Worker         {
1412*35ffd701SAndroid Build Coastguard Worker             // TODO BLT rect should not overlap between planes.
1413*35ffd701SAndroid Build Coastguard Worker             {
1414*35ffd701SAndroid Build Coastguard Worker                 // __GMM_ASSERT(0); // decide later, for now blt it
1415*35ffd701SAndroid Build Coastguard Worker                 //return 0;
1416*35ffd701SAndroid Build Coastguard Worker             }
1417*35ffd701SAndroid Build Coastguard Worker 
1418*35ffd701SAndroid Build Coastguard Worker             // BLT monolithic surface per plane and remove padding due to tiling.
1419*35ffd701SAndroid Build Coastguard Worker             for(PlaneId = GMM_PLANE_Y; PlaneId <= pTextureCalc->GetNumberOfPlanes(pTexInfo); PlaneId++)
1420*35ffd701SAndroid Build Coastguard Worker             {
1421*35ffd701SAndroid Build Coastguard Worker                 pTextureCalc->GetBltInfoPerPlane(pTexInfo, pBlt, PlaneId);
1422*35ffd701SAndroid Build Coastguard Worker                 CpuBlt(pBlt);
1423*35ffd701SAndroid Build Coastguard Worker             }
1424*35ffd701SAndroid Build Coastguard Worker         }
1425*35ffd701SAndroid Build Coastguard Worker         // else  continue below
1426*35ffd701SAndroid Build Coastguard Worker     }
1427*35ffd701SAndroid Build Coastguard Worker 
1428*35ffd701SAndroid Build Coastguard Worker     // UV packed planar surfaces will have different tiling geometries for the
1429*35ffd701SAndroid Build Coastguard Worker     // Y and UV planes. Blts cannot span across the tiling boundaries and we
1430*35ffd701SAndroid Build Coastguard Worker     // must select the proper mode for each plane. Non-UV packed formats will
1431*35ffd701SAndroid Build Coastguard Worker     // have a constant tiling mode, and so do not have the same limits
1432*35ffd701SAndroid Build Coastguard Worker     if(Surf.Flags.Info.RedecribedPlanes &&
1433*35ffd701SAndroid Build Coastguard Worker        GmmIsUVPacked(Surf.Format))
1434*35ffd701SAndroid Build Coastguard Worker     {
1435*35ffd701SAndroid Build Coastguard Worker         if(!((pBlt->Gpu.OffsetY >= pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U]) ||
1436*35ffd701SAndroid Build Coastguard Worker              ((pBlt->Gpu.OffsetY + pBlt->Blt.Height) <= pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U])))
1437*35ffd701SAndroid Build Coastguard Worker         {
1438*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(0);
1439*35ffd701SAndroid Build Coastguard Worker             return false;
1440*35ffd701SAndroid Build Coastguard Worker         }
1441*35ffd701SAndroid Build Coastguard Worker 
1442*35ffd701SAndroid Build Coastguard Worker         if(pBlt->Gpu.OffsetY < pTexInfo->OffsetInfo.Plane.Y[GMM_PLANE_U])
1443*35ffd701SAndroid Build Coastguard Worker         {
1444*35ffd701SAndroid Build Coastguard Worker 	    pTextureCalc->GetRedescribedPlaneParams(pTexInfo, GMM_PLANE_Y, &RedescribedPlaneInfo);
1445*35ffd701SAndroid Build Coastguard Worker             // Y Plane
1446*35ffd701SAndroid Build Coastguard Worker             pTexInfo = &RedescribedPlaneInfo;
1447*35ffd701SAndroid Build Coastguard Worker         }
1448*35ffd701SAndroid Build Coastguard Worker         else
1449*35ffd701SAndroid Build Coastguard Worker         {
1450*35ffd701SAndroid Build Coastguard Worker             // UV Plane
1451*35ffd701SAndroid Build Coastguard Worker 	    pTextureCalc->GetRedescribedPlaneParams(pTexInfo, GMM_PLANE_U, &RedescribedPlaneInfo);
1452*35ffd701SAndroid Build Coastguard Worker             pTexInfo = &RedescribedPlaneInfo;
1453*35ffd701SAndroid Build Coastguard Worker         }
1454*35ffd701SAndroid Build Coastguard Worker     }
1455*35ffd701SAndroid Build Coastguard Worker 
1456*35ffd701SAndroid Build Coastguard Worker     if(pBlt->Blt.Slices > 1)
1457*35ffd701SAndroid Build Coastguard Worker     {
1458*35ffd701SAndroid Build Coastguard Worker         GMM_RES_COPY_BLT SliceBlt = *pBlt;
1459*35ffd701SAndroid Build Coastguard Worker         uint32_t         Slice;
1460*35ffd701SAndroid Build Coastguard Worker 
1461*35ffd701SAndroid Build Coastguard Worker         SliceBlt.Blt.Slices = 1;
1462*35ffd701SAndroid Build Coastguard Worker         for(Slice = pBlt->Gpu.Slice;
1463*35ffd701SAndroid Build Coastguard Worker             Slice < (pBlt->Gpu.Slice + pBlt->Blt.Slices);
1464*35ffd701SAndroid Build Coastguard Worker             Slice++)
1465*35ffd701SAndroid Build Coastguard Worker         {
1466*35ffd701SAndroid Build Coastguard Worker             SliceBlt.Gpu.Slice      = Slice;
1467*35ffd701SAndroid Build Coastguard Worker             SliceBlt.Sys.pData      = (void *)((char *)pBlt->Sys.pData + (Slice - pBlt->Gpu.Slice) * pBlt->Sys.SlicePitch);
1468*35ffd701SAndroid Build Coastguard Worker             SliceBlt.Sys.BufferSize = pBlt->Sys.BufferSize - GFX_ULONG_CAST((char *)SliceBlt.Sys.pData - (char *)pBlt->Sys.pData);
1469*35ffd701SAndroid Build Coastguard Worker             CpuBlt(&SliceBlt);
1470*35ffd701SAndroid Build Coastguard Worker         }
1471*35ffd701SAndroid Build Coastguard Worker     }
1472*35ffd701SAndroid Build Coastguard Worker     else // Single Subresource...
1473*35ffd701SAndroid Build Coastguard Worker     {
1474*35ffd701SAndroid Build Coastguard Worker         uint32_t            ResPixelPitch = pTexInfo->BitsPerPixel / CHAR_BIT;
1475*35ffd701SAndroid Build Coastguard Worker         uint32_t            BlockWidth, BlockHeight, BlockDepth;
1476*35ffd701SAndroid Build Coastguard Worker         uint32_t            __CopyWidthBytes, __CopyHeight, __OffsetXBytes, __OffsetY;
1477*35ffd701SAndroid Build Coastguard Worker         GMM_REQ_OFFSET_INFO GetOffset = {0};
1478*35ffd701SAndroid Build Coastguard Worker 
1479*35ffd701SAndroid Build Coastguard Worker         pTextureCalc->GetCompressionBlockDimensions(pTexInfo->Format, &BlockWidth, &BlockHeight, &BlockDepth);
1480*35ffd701SAndroid Build Coastguard Worker 
1481*35ffd701SAndroid Build Coastguard Worker #if(LHDM)
1482*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->MsFormat == D3DDDIFMT_G8R8_G8B8 ||
1483*35ffd701SAndroid Build Coastguard Worker            pTexInfo->MsFormat == D3DDDIFMT_R8G8_B8G8)
1484*35ffd701SAndroid Build Coastguard Worker         {
1485*35ffd701SAndroid Build Coastguard Worker             BlockWidth    = 2;
1486*35ffd701SAndroid Build Coastguard Worker             ResPixelPitch = 4;
1487*35ffd701SAndroid Build Coastguard Worker         }
1488*35ffd701SAndroid Build Coastguard Worker #endif
1489*35ffd701SAndroid Build Coastguard Worker 
1490*35ffd701SAndroid Build Coastguard Worker         { // __CopyWidthBytes...
1491*35ffd701SAndroid Build Coastguard Worker             uint32_t Width;
1492*35ffd701SAndroid Build Coastguard Worker 
1493*35ffd701SAndroid Build Coastguard Worker             if(!pBlt->Blt.Width) // i.e. "Full Width"
1494*35ffd701SAndroid Build Coastguard Worker             {
1495*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(!GmmIsPlanar(pTexInfo->Format)); // Caller must set Blt.Width--GMM "auto-size on zero" not supported with planars since multiple interpretations would confuse more than help.
1496*35ffd701SAndroid Build Coastguard Worker 
1497*35ffd701SAndroid Build Coastguard Worker                 Width = GFX_ULONG_CAST(pTextureCalc->GmmTexGetMipWidth(pTexInfo, pBlt->Gpu.MipLevel));
1498*35ffd701SAndroid Build Coastguard Worker 
1499*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(Width >= pBlt->Gpu.OffsetX);
1500*35ffd701SAndroid Build Coastguard Worker                 Width -= pBlt->Gpu.OffsetX;
1501*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(Width);
1502*35ffd701SAndroid Build Coastguard Worker             }
1503*35ffd701SAndroid Build Coastguard Worker             else
1504*35ffd701SAndroid Build Coastguard Worker             {
1505*35ffd701SAndroid Build Coastguard Worker                 Width = pBlt->Blt.Width;
1506*35ffd701SAndroid Build Coastguard Worker             }
1507*35ffd701SAndroid Build Coastguard Worker 
1508*35ffd701SAndroid Build Coastguard Worker             if(((pBlt->Sys.PixelPitch == 0) ||
1509*35ffd701SAndroid Build Coastguard Worker                 (pBlt->Sys.PixelPitch == ResPixelPitch)) &&
1510*35ffd701SAndroid Build Coastguard Worker                ((pBlt->Blt.BytesPerPixel == 0) ||
1511*35ffd701SAndroid Build Coastguard Worker                 (pBlt->Blt.BytesPerPixel == ResPixelPitch)))
1512*35ffd701SAndroid Build Coastguard Worker             {
1513*35ffd701SAndroid Build Coastguard Worker                 // Full-Pixel BLT...
1514*35ffd701SAndroid Build Coastguard Worker                 __CopyWidthBytes =
1515*35ffd701SAndroid Build Coastguard Worker                 GFX_CEIL_DIV(Width, BlockWidth) * ResPixelPitch;
1516*35ffd701SAndroid Build Coastguard Worker             }
1517*35ffd701SAndroid Build Coastguard Worker             else // Partial-Pixel BLT...
1518*35ffd701SAndroid Build Coastguard Worker             {
1519*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(BlockWidth == 1); // No partial-pixel support for block-compressed formats.
1520*35ffd701SAndroid Build Coastguard Worker 
1521*35ffd701SAndroid Build Coastguard Worker                 // When copying between surfaces with different pixel pitches,
1522*35ffd701SAndroid Build Coastguard Worker                 // specify CopyWidthBytes in terms of unswizzled surface
1523*35ffd701SAndroid Build Coastguard Worker                 // (convenient convention used by CpuSwizzleBlt).
1524*35ffd701SAndroid Build Coastguard Worker                 __CopyWidthBytes =
1525*35ffd701SAndroid Build Coastguard Worker                 Width *
1526*35ffd701SAndroid Build Coastguard Worker                 (pBlt->Sys.PixelPitch ?
1527*35ffd701SAndroid Build Coastguard Worker                  pBlt->Sys.PixelPitch :
1528*35ffd701SAndroid Build Coastguard Worker                  ResPixelPitch);
1529*35ffd701SAndroid Build Coastguard Worker             }
1530*35ffd701SAndroid Build Coastguard Worker         }
1531*35ffd701SAndroid Build Coastguard Worker 
1532*35ffd701SAndroid Build Coastguard Worker         {                         // __CopyHeight...
1533*35ffd701SAndroid Build Coastguard Worker             if(!pBlt->Blt.Height) // i.e. "Full Height"
1534*35ffd701SAndroid Build Coastguard Worker             {
1535*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(!GmmIsPlanar(pTexInfo->Format)); // Caller must set Blt.Height--GMM "auto-size on zero" not supported with planars since multiple interpretations would confuse more than help.
1536*35ffd701SAndroid Build Coastguard Worker 
1537*35ffd701SAndroid Build Coastguard Worker                 __CopyHeight = pTextureCalc->GmmTexGetMipHeight(pTexInfo, pBlt->Gpu.MipLevel);
1538*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(__CopyHeight >= pBlt->Gpu.OffsetY);
1539*35ffd701SAndroid Build Coastguard Worker                 __CopyHeight -= pBlt->Gpu.OffsetY;
1540*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(__CopyHeight);
1541*35ffd701SAndroid Build Coastguard Worker             }
1542*35ffd701SAndroid Build Coastguard Worker             else
1543*35ffd701SAndroid Build Coastguard Worker             {
1544*35ffd701SAndroid Build Coastguard Worker                 __CopyHeight = pBlt->Blt.Height;
1545*35ffd701SAndroid Build Coastguard Worker             }
1546*35ffd701SAndroid Build Coastguard Worker 
1547*35ffd701SAndroid Build Coastguard Worker             __CopyHeight = GFX_CEIL_DIV(__CopyHeight, BlockHeight);
1548*35ffd701SAndroid Build Coastguard Worker         }
1549*35ffd701SAndroid Build Coastguard Worker 
1550*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((pBlt->Gpu.OffsetX % BlockWidth) == 0);
1551*35ffd701SAndroid Build Coastguard Worker         __OffsetXBytes = (pBlt->Gpu.OffsetX / BlockWidth) * ResPixelPitch + pBlt->Gpu.OffsetSubpixel;
1552*35ffd701SAndroid Build Coastguard Worker 
1553*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT((pBlt->Gpu.OffsetY % BlockHeight) == 0);
1554*35ffd701SAndroid Build Coastguard Worker         __OffsetY = (pBlt->Gpu.OffsetY / BlockHeight);
1555*35ffd701SAndroid Build Coastguard Worker 
1556*35ffd701SAndroid Build Coastguard Worker         { // Get pResData Offsets to this subresource...
1557*35ffd701SAndroid Build Coastguard Worker             GetOffset.ReqLock      = pTexInfo->Flags.Info.Linear;
1558*35ffd701SAndroid Build Coastguard Worker             GetOffset.ReqStdLayout = !GetOffset.ReqLock && pTexInfo->Flags.Info.StdSwizzle;
1559*35ffd701SAndroid Build Coastguard Worker             GetOffset.ReqRender    = !GetOffset.ReqLock && !GetOffset.ReqStdLayout;
1560*35ffd701SAndroid Build Coastguard Worker             GetOffset.MipLevel     = pBlt->Gpu.MipLevel;
1561*35ffd701SAndroid Build Coastguard Worker             switch(pTexInfo->Type)
1562*35ffd701SAndroid Build Coastguard Worker             {
1563*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_1D:
1564*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_2D:
1565*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_PRIMARY:
1566*35ffd701SAndroid Build Coastguard Worker                 {
1567*35ffd701SAndroid Build Coastguard Worker                     GetOffset.ArrayIndex = pBlt->Gpu.Slice;
1568*35ffd701SAndroid Build Coastguard Worker                     break;
1569*35ffd701SAndroid Build Coastguard Worker                 }
1570*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_CUBE:
1571*35ffd701SAndroid Build Coastguard Worker                 {
1572*35ffd701SAndroid Build Coastguard Worker                     GetOffset.ArrayIndex = pBlt->Gpu.Slice / 6;
1573*35ffd701SAndroid Build Coastguard Worker                     GetOffset.CubeFace   = (GMM_CUBE_FACE_ENUM)(pBlt->Gpu.Slice % 6);
1574*35ffd701SAndroid Build Coastguard Worker                     break;
1575*35ffd701SAndroid Build Coastguard Worker                 }
1576*35ffd701SAndroid Build Coastguard Worker                 case RESOURCE_3D:
1577*35ffd701SAndroid Build Coastguard Worker                 {
1578*35ffd701SAndroid Build Coastguard Worker                     GetOffset.Slice = (GMM_IS_64KB_TILE(pTexInfo->Flags) || pTexInfo->Flags.Info.TiledYf) ?
1579*35ffd701SAndroid Build Coastguard Worker                                       (pBlt->Gpu.Slice / pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileDepth) :
1580*35ffd701SAndroid Build Coastguard Worker                                       pBlt->Gpu.Slice;
1581*35ffd701SAndroid Build Coastguard Worker                     break;
1582*35ffd701SAndroid Build Coastguard Worker                 }
1583*35ffd701SAndroid Build Coastguard Worker                 default:
1584*35ffd701SAndroid Build Coastguard Worker                     __GMM_ASSERT(0);
1585*35ffd701SAndroid Build Coastguard Worker             }
1586*35ffd701SAndroid Build Coastguard Worker 
1587*35ffd701SAndroid Build Coastguard Worker             REQUIRE(this->GetOffset(GetOffset) == GMM_SUCCESS);
1588*35ffd701SAndroid Build Coastguard Worker         }
1589*35ffd701SAndroid Build Coastguard Worker 
1590*35ffd701SAndroid Build Coastguard Worker         if(pTexInfo->Flags.Info.Linear)
1591*35ffd701SAndroid Build Coastguard Worker         {
1592*35ffd701SAndroid Build Coastguard Worker             char *   pDest, *pSrc;
1593*35ffd701SAndroid Build Coastguard Worker             uint32_t DestPitch, SrcPitch;
1594*35ffd701SAndroid Build Coastguard Worker             uint32_t y;
1595*35ffd701SAndroid Build Coastguard Worker 
1596*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT( // Linear-to-linear subpixel BLT unexpected--Not implemented.
1597*35ffd701SAndroid Build Coastguard Worker             (!pBlt->Sys.PixelPitch || (pBlt->Sys.PixelPitch == ResPixelPitch)) &&
1598*35ffd701SAndroid Build Coastguard Worker             (!pBlt->Blt.BytesPerPixel || (pBlt->Blt.BytesPerPixel == ResPixelPitch)));
1599*35ffd701SAndroid Build Coastguard Worker 
1600*35ffd701SAndroid Build Coastguard Worker             if(pBlt->Blt.Upload)
1601*35ffd701SAndroid Build Coastguard Worker             {
1602*35ffd701SAndroid Build Coastguard Worker                 pDest     = (char *)pBlt->Gpu.pData;
1603*35ffd701SAndroid Build Coastguard Worker                 DestPitch = GFX_ULONG_CAST(pTexInfo->Pitch);
1604*35ffd701SAndroid Build Coastguard Worker 
1605*35ffd701SAndroid Build Coastguard Worker                 pSrc     = (char *)pBlt->Sys.pData;
1606*35ffd701SAndroid Build Coastguard Worker                 SrcPitch = pBlt->Sys.RowPitch;
1607*35ffd701SAndroid Build Coastguard Worker             }
1608*35ffd701SAndroid Build Coastguard Worker             else
1609*35ffd701SAndroid Build Coastguard Worker             {
1610*35ffd701SAndroid Build Coastguard Worker                 pDest     = (char *)pBlt->Sys.pData;
1611*35ffd701SAndroid Build Coastguard Worker                 DestPitch = pBlt->Sys.RowPitch;
1612*35ffd701SAndroid Build Coastguard Worker 
1613*35ffd701SAndroid Build Coastguard Worker                 pSrc     = (char *)pBlt->Gpu.pData;
1614*35ffd701SAndroid Build Coastguard Worker                 SrcPitch = GFX_ULONG_CAST(pTexInfo->Pitch);
1615*35ffd701SAndroid Build Coastguard Worker             }
1616*35ffd701SAndroid Build Coastguard Worker 
1617*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(GetOffset.Lock.Offset < pTexInfo->Size);
1618*35ffd701SAndroid Build Coastguard Worker             pDest += GetOffset.Lock.Offset + (__OffsetY * DestPitch + __OffsetXBytes);
1619*35ffd701SAndroid Build Coastguard Worker 
1620*35ffd701SAndroid Build Coastguard Worker             for(y = 0; y < __CopyHeight; y++)
1621*35ffd701SAndroid Build Coastguard Worker             {
1622*35ffd701SAndroid Build Coastguard Worker // Memcpy per row isn't optimal, but doubt this linear-to-linear path matters.
1623*35ffd701SAndroid Build Coastguard Worker 
1624*35ffd701SAndroid Build Coastguard Worker #if _WIN32
1625*35ffd701SAndroid Build Coastguard Worker #ifdef __GMM_KMD__
1626*35ffd701SAndroid Build Coastguard Worker                 GFX_MEMCPY_S
1627*35ffd701SAndroid Build Coastguard Worker #else
1628*35ffd701SAndroid Build Coastguard Worker                 memcpy_s
1629*35ffd701SAndroid Build Coastguard Worker #endif
1630*35ffd701SAndroid Build Coastguard Worker                 (pDest, __CopyWidthBytes, pSrc, __CopyWidthBytes);
1631*35ffd701SAndroid Build Coastguard Worker #else
1632*35ffd701SAndroid Build Coastguard Worker                 memcpy(pDest, pSrc, __CopyWidthBytes);
1633*35ffd701SAndroid Build Coastguard Worker #endif
1634*35ffd701SAndroid Build Coastguard Worker                 pDest += DestPitch;
1635*35ffd701SAndroid Build Coastguard Worker                 pSrc += SrcPitch;
1636*35ffd701SAndroid Build Coastguard Worker             }
1637*35ffd701SAndroid Build Coastguard Worker         }
1638*35ffd701SAndroid Build Coastguard Worker         else // Swizzled BLT...
1639*35ffd701SAndroid Build Coastguard Worker         {
1640*35ffd701SAndroid Build Coastguard Worker             CPU_SWIZZLE_BLT_SURFACE LinearSurface = {0}, SwizzledSurface;
1641*35ffd701SAndroid Build Coastguard Worker             uint32_t                ZOffset       = 0;
1642*35ffd701SAndroid Build Coastguard Worker 
1643*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(GetOffset.Render.Offset64 < pTexInfo->Size);
1644*35ffd701SAndroid Build Coastguard Worker 
1645*35ffd701SAndroid Build Coastguard Worker             ZOffset = (pTexInfo->Type == RESOURCE_3D &&
1646*35ffd701SAndroid Build Coastguard Worker                        (GMM_IS_64KB_TILE(pTexInfo->Flags) || pTexInfo->Flags.Info.TiledYf)) ?
1647*35ffd701SAndroid Build Coastguard Worker                       (pBlt->Gpu.Slice % pPlatform->TileInfo[pTexInfo->TileMode].LogicalTileDepth) :
1648*35ffd701SAndroid Build Coastguard Worker                       0;
1649*35ffd701SAndroid Build Coastguard Worker 
1650*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.StdSwizzle == 1)
1651*35ffd701SAndroid Build Coastguard Worker             {
1652*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.pBase   = (char *)pBlt->Gpu.pData + GFX_ULONG_CAST(GetOffset.StdLayout.Offset);
1653*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.OffsetX = __OffsetXBytes;
1654*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.OffsetY = __OffsetY;
1655*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.OffsetZ = ZOffset;
1656*35ffd701SAndroid Build Coastguard Worker 
1657*35ffd701SAndroid Build Coastguard Worker                 uint32_t MipWidth  = GFX_ULONG_CAST(pTextureCalc->GmmTexGetMipWidth(pTexInfo, pBlt->Gpu.MipLevel));
1658*35ffd701SAndroid Build Coastguard Worker                 uint32_t MipHeight = pTextureCalc->GmmTexGetMipHeight(pTexInfo, pBlt->Gpu.MipLevel);
1659*35ffd701SAndroid Build Coastguard Worker 
1660*35ffd701SAndroid Build Coastguard Worker                 pTextureCalc->AlignTexHeightWidth(pTexInfo, &MipHeight, &MipWidth);
1661*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.Height = MipHeight;
1662*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.Pitch  = MipWidth * ResPixelPitch;
1663*35ffd701SAndroid Build Coastguard Worker             }
1664*35ffd701SAndroid Build Coastguard Worker             else
1665*35ffd701SAndroid Build Coastguard Worker             {
1666*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.pBase   = (char *)pBlt->Gpu.pData + GFX_ULONG_CAST(GetOffset.Render.Offset64);
1667*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.Pitch   = GFX_ULONG_CAST(pTexInfo->Pitch);
1668*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.OffsetX = GetOffset.Render.XOffset + __OffsetXBytes;
1669*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.OffsetY = GetOffset.Render.YOffset + __OffsetY;
1670*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.OffsetZ = GetOffset.Render.ZOffset + ZOffset;
1671*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.Height  = GFX_ULONG_CAST(pTexInfo->Size / pTexInfo->Pitch);
1672*35ffd701SAndroid Build Coastguard Worker             }
1673*35ffd701SAndroid Build Coastguard Worker 
1674*35ffd701SAndroid Build Coastguard Worker             SwizzledSurface.Element.Pitch = ResPixelPitch;
1675*35ffd701SAndroid Build Coastguard Worker 
1676*35ffd701SAndroid Build Coastguard Worker             LinearSurface.pBase = pBlt->Sys.pData;
1677*35ffd701SAndroid Build Coastguard Worker             LinearSurface.Pitch = pBlt->Sys.RowPitch;
1678*35ffd701SAndroid Build Coastguard Worker             LinearSurface.Height =
1679*35ffd701SAndroid Build Coastguard Worker             pBlt->Sys.BufferSize /
1680*35ffd701SAndroid Build Coastguard Worker             (pBlt->Sys.RowPitch ?
1681*35ffd701SAndroid Build Coastguard Worker              pBlt->Sys.RowPitch :
1682*35ffd701SAndroid Build Coastguard Worker              pBlt->Sys.BufferSize);
1683*35ffd701SAndroid Build Coastguard Worker             LinearSurface.Element.Pitch =
1684*35ffd701SAndroid Build Coastguard Worker             pBlt->Sys.PixelPitch ?
1685*35ffd701SAndroid Build Coastguard Worker             pBlt->Sys.PixelPitch :
1686*35ffd701SAndroid Build Coastguard Worker             ResPixelPitch;
1687*35ffd701SAndroid Build Coastguard Worker             LinearSurface.Element.Size =
1688*35ffd701SAndroid Build Coastguard Worker             SwizzledSurface.Element.Size =
1689*35ffd701SAndroid Build Coastguard Worker             pBlt->Blt.BytesPerPixel ?
1690*35ffd701SAndroid Build Coastguard Worker             pBlt->Blt.BytesPerPixel :
1691*35ffd701SAndroid Build Coastguard Worker             ResPixelPitch;
1692*35ffd701SAndroid Build Coastguard Worker 
1693*35ffd701SAndroid Build Coastguard Worker             SwizzledSurface.pSwizzle = NULL;
1694*35ffd701SAndroid Build Coastguard Worker 
1695*35ffd701SAndroid Build Coastguard Worker             if(pTexInfo->Flags.Info.TiledW)
1696*35ffd701SAndroid Build Coastguard Worker             {
1697*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.pSwizzle = &INTEL_TILE_W;
1698*35ffd701SAndroid Build Coastguard Worker 
1699*35ffd701SAndroid Build Coastguard Worker                 // Correct for GMM's 2x Pitch handling of stencil...
1700*35ffd701SAndroid Build Coastguard Worker                 // (Unlike the HW, CpuSwizzleBlt handles TileW as a natural,
1701*35ffd701SAndroid Build Coastguard Worker                 // 64x64=4KB tile, so the pre-Gen10 "double-pitch/half-height"
1702*35ffd701SAndroid Build Coastguard Worker                 // kludging to TileY shape must be reversed.)
1703*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT((SwizzledSurface.Pitch % 2) == 0);
1704*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.Pitch /= 2;
1705*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.Height *= 2;
1706*35ffd701SAndroid Build Coastguard Worker             }
1707*35ffd701SAndroid Build Coastguard Worker             else if(GMM_IS_4KB_TILE(pTexInfo->Flags) &&
1708*35ffd701SAndroid Build Coastguard Worker                     !(pTexInfo->Flags.Info.TiledYf ||
1709*35ffd701SAndroid Build Coastguard Worker                       GMM_IS_64KB_TILE(pTexInfo->Flags)))
1710*35ffd701SAndroid Build Coastguard Worker             {
1711*35ffd701SAndroid Build Coastguard Worker                 if(GetGmmLibContext()->GetSkuTable().FtrTileY)
1712*35ffd701SAndroid Build Coastguard Worker                  {
1713*35ffd701SAndroid Build Coastguard Worker                     SwizzledSurface.pSwizzle = &INTEL_TILE_Y;
1714*35ffd701SAndroid Build Coastguard Worker                 }
1715*35ffd701SAndroid Build Coastguard Worker                 else
1716*35ffd701SAndroid Build Coastguard Worker                 {
1717*35ffd701SAndroid Build Coastguard Worker                     SwizzledSurface.pSwizzle = &INTEL_TILE_4;
1718*35ffd701SAndroid Build Coastguard Worker                 }
1719*35ffd701SAndroid Build Coastguard Worker             }
1720*35ffd701SAndroid Build Coastguard Worker             else if(pTexInfo->Flags.Info.TiledX)
1721*35ffd701SAndroid Build Coastguard Worker             {
1722*35ffd701SAndroid Build Coastguard Worker                 SwizzledSurface.pSwizzle = &INTEL_TILE_X;
1723*35ffd701SAndroid Build Coastguard Worker             }
1724*35ffd701SAndroid Build Coastguard Worker             else // Yf/s...
1725*35ffd701SAndroid Build Coastguard Worker             {
1726*35ffd701SAndroid Build Coastguard Worker // clang-format off
1727*35ffd701SAndroid Build Coastguard Worker                 #define NA
1728*35ffd701SAndroid Build Coastguard Worker 
1729*35ffd701SAndroid Build Coastguard Worker                 #define CASE(Layout, Tile, msaa, xD, bpe)                               \
1730*35ffd701SAndroid Build Coastguard Worker                     case bpe:                                                           \
1731*35ffd701SAndroid Build Coastguard Worker                         SwizzledSurface.pSwizzle = &Layout##_##Tile##_##msaa##xD##bpe;  \
1732*35ffd701SAndroid Build Coastguard Worker                         break
1733*35ffd701SAndroid Build Coastguard Worker 
1734*35ffd701SAndroid Build Coastguard Worker                 #define SWITCH_BPP(Layout, Tile, msaa, xD)    \
1735*35ffd701SAndroid Build Coastguard Worker                     switch(pTexInfo->BitsPerPixel)            \
1736*35ffd701SAndroid Build Coastguard Worker                     {                                         \
1737*35ffd701SAndroid Build Coastguard Worker                         CASE(Layout, Tile, msaa, xD, 8);      \
1738*35ffd701SAndroid Build Coastguard Worker                         CASE(Layout, Tile, msaa, xD, 16);     \
1739*35ffd701SAndroid Build Coastguard Worker                         CASE(Layout, Tile, msaa, xD, 32);     \
1740*35ffd701SAndroid Build Coastguard Worker                         CASE(Layout, Tile, msaa, xD, 64);     \
1741*35ffd701SAndroid Build Coastguard Worker                         CASE(Layout, Tile, msaa, xD, 128);    \
1742*35ffd701SAndroid Build Coastguard Worker                     }
1743*35ffd701SAndroid Build Coastguard Worker 
1744*35ffd701SAndroid Build Coastguard Worker                 #define SWITCH_MSAA_TILE64(Layout, Tile, xD)     \
1745*35ffd701SAndroid Build Coastguard Worker                 {\
1746*35ffd701SAndroid Build Coastguard Worker                     switch(pTexInfo->MSAA.NumSamples)           \
1747*35ffd701SAndroid Build Coastguard Worker                     {                                           \
1748*35ffd701SAndroid Build Coastguard Worker                         case 0:                                 \
1749*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, TILE_64, , xD);    \
1750*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1751*35ffd701SAndroid Build Coastguard Worker                         case 1:                                 \
1752*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, TILE_64, , xD);    \
1753*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1754*35ffd701SAndroid Build Coastguard Worker                         case 2:                                 \
1755*35ffd701SAndroid Build Coastguard Worker                             if(GetGmmLibContext()->GetSkuTable().FtrXe2PlusTiling)\
1756*35ffd701SAndroid Build Coastguard Worker                             { \
1757*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64_V2, MSAA2_, xD); \
1758*35ffd701SAndroid Build Coastguard Worker                             }\
1759*35ffd701SAndroid Build Coastguard Worker                             else\
1760*35ffd701SAndroid Build Coastguard Worker                             { \
1761*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64, MSAA2_, xD); \
1762*35ffd701SAndroid Build Coastguard Worker                             } \
1763*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1764*35ffd701SAndroid Build Coastguard Worker                         case 4:                                 \
1765*35ffd701SAndroid Build Coastguard Worker                             if(GetGmmLibContext()->GetSkuTable().FtrXe2PlusTiling)\
1766*35ffd701SAndroid Build Coastguard Worker                             { \
1767*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64_V2, MSAA4_, xD); \
1768*35ffd701SAndroid Build Coastguard Worker                             }\
1769*35ffd701SAndroid Build Coastguard Worker                             else\
1770*35ffd701SAndroid Build Coastguard Worker                             { \
1771*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64, MSAA_, xD); \
1772*35ffd701SAndroid Build Coastguard Worker                             } \
1773*35ffd701SAndroid Build Coastguard Worker                             break; \
1774*35ffd701SAndroid Build Coastguard Worker                         case 8:                                 \
1775*35ffd701SAndroid Build Coastguard Worker                             if(GetGmmLibContext()->GetSkuTable().FtrXe2PlusTiling)\
1776*35ffd701SAndroid Build Coastguard Worker                             { \
1777*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64_V2, MSAA8_, xD); \
1778*35ffd701SAndroid Build Coastguard Worker                             }\
1779*35ffd701SAndroid Build Coastguard Worker                             else\
1780*35ffd701SAndroid Build Coastguard Worker                             { \
1781*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64, MSAA_, xD); \
1782*35ffd701SAndroid Build Coastguard Worker                             } \
1783*35ffd701SAndroid Build Coastguard Worker                             break; \
1784*35ffd701SAndroid Build Coastguard Worker                         case 16:                                \
1785*35ffd701SAndroid Build Coastguard Worker                             if(GetGmmLibContext()->GetSkuTable().FtrXe2PlusTiling)\
1786*35ffd701SAndroid Build Coastguard Worker                             { \
1787*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64_V2, MSAA16_, xD); \
1788*35ffd701SAndroid Build Coastguard Worker                             }\
1789*35ffd701SAndroid Build Coastguard Worker                             else\
1790*35ffd701SAndroid Build Coastguard Worker                             { \
1791*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(Layout, TILE_64, MSAA_, xD); \
1792*35ffd701SAndroid Build Coastguard Worker                             } \
1793*35ffd701SAndroid Build Coastguard Worker                             break; \
1794*35ffd701SAndroid Build Coastguard Worker                     }                                           \
1795*35ffd701SAndroid Build Coastguard Worker                 } \
1796*35ffd701SAndroid Build Coastguard Worker 
1797*35ffd701SAndroid Build Coastguard Worker                 #define SWITCH_MSAA(Layout, Tile, xD)           \
1798*35ffd701SAndroid Build Coastguard Worker                 {\
1799*35ffd701SAndroid Build Coastguard Worker                     switch(pTexInfo->MSAA.NumSamples)           \
1800*35ffd701SAndroid Build Coastguard Worker                     {                                           \
1801*35ffd701SAndroid Build Coastguard Worker                         case 0:                                 \
1802*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, Tile, , xD);     \
1803*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1804*35ffd701SAndroid Build Coastguard Worker                         case 1:                                 \
1805*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, Tile, , xD);     \
1806*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1807*35ffd701SAndroid Build Coastguard Worker                         case 2:                                 \
1808*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, Tile, MSAA2_, xD);  \
1809*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1810*35ffd701SAndroid Build Coastguard Worker                         case 4:                                 \
1811*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, Tile, MSAA4_, xD);  \
1812*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1813*35ffd701SAndroid Build Coastguard Worker                         case 8:                                 \
1814*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, Tile, MSAA8_, xD);     \
1815*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1816*35ffd701SAndroid Build Coastguard Worker                         case 16:                                \
1817*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(Layout, Tile, MSAA16_, xD);    \
1818*35ffd701SAndroid Build Coastguard Worker                             break;                              \
1819*35ffd701SAndroid Build Coastguard Worker                     }\
1820*35ffd701SAndroid Build Coastguard Worker                 }
1821*35ffd701SAndroid Build Coastguard Worker                 // clang-format on
1822*35ffd701SAndroid Build Coastguard Worker 
1823*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->Type == RESOURCE_3D)
1824*35ffd701SAndroid Build Coastguard Worker                 {
1825*35ffd701SAndroid Build Coastguard Worker                     if(pTexInfo->Flags.Info.TiledYf)
1826*35ffd701SAndroid Build Coastguard Worker                     {
1827*35ffd701SAndroid Build Coastguard Worker                         SWITCH_BPP(INTEL, TILE_YF, , 3D_);
1828*35ffd701SAndroid Build Coastguard Worker                     }
1829*35ffd701SAndroid Build Coastguard Worker                     else if(GMM_IS_64KB_TILE(pTexInfo->Flags))
1830*35ffd701SAndroid Build Coastguard Worker                     {
1831*35ffd701SAndroid Build Coastguard Worker                         if(GetGmmLibContext()->GetSkuTable().FtrTileY)
1832*35ffd701SAndroid Build Coastguard Worker                         {
1833*35ffd701SAndroid Build Coastguard Worker                             SWITCH_BPP(INTEL, TILE_YS, , 3D_);
1834*35ffd701SAndroid Build Coastguard Worker                         }
1835*35ffd701SAndroid Build Coastguard Worker                         else
1836*35ffd701SAndroid Build Coastguard Worker                         {
1837*35ffd701SAndroid Build Coastguard Worker                             if (GetGmmLibContext()->GetSkuTable().FtrXe2PlusTiling)
1838*35ffd701SAndroid Build Coastguard Worker                             {
1839*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(INTEL, TILE_64_V2, , 3D_);
1840*35ffd701SAndroid Build Coastguard Worker                             }
1841*35ffd701SAndroid Build Coastguard Worker                             else
1842*35ffd701SAndroid Build Coastguard Worker                             {
1843*35ffd701SAndroid Build Coastguard Worker                                 SWITCH_BPP(INTEL, TILE_64, , 3D_);
1844*35ffd701SAndroid Build Coastguard Worker                             }
1845*35ffd701SAndroid Build Coastguard Worker                         }
1846*35ffd701SAndroid Build Coastguard Worker                     }
1847*35ffd701SAndroid Build Coastguard Worker                 }
1848*35ffd701SAndroid Build Coastguard Worker                 else // 2D/Cube...
1849*35ffd701SAndroid Build Coastguard Worker                 {
1850*35ffd701SAndroid Build Coastguard Worker                     if(pTexInfo->Flags.Info.TiledYf)
1851*35ffd701SAndroid Build Coastguard Worker                     {
1852*35ffd701SAndroid Build Coastguard Worker                         SWITCH_MSAA(INTEL, TILE_YF, );
1853*35ffd701SAndroid Build Coastguard Worker                     }
1854*35ffd701SAndroid Build Coastguard Worker                     else if(GMM_IS_64KB_TILE(pTexInfo->Flags))
1855*35ffd701SAndroid Build Coastguard Worker                     {
1856*35ffd701SAndroid Build Coastguard Worker                         if(GetGmmLibContext()->GetSkuTable().FtrTileY)
1857*35ffd701SAndroid Build Coastguard Worker                         {
1858*35ffd701SAndroid Build Coastguard Worker                             SWITCH_MSAA(INTEL, TILE_YS, );
1859*35ffd701SAndroid Build Coastguard Worker                         }
1860*35ffd701SAndroid Build Coastguard Worker                         else
1861*35ffd701SAndroid Build Coastguard Worker                         {
1862*35ffd701SAndroid Build Coastguard Worker                             SWITCH_MSAA_TILE64(INTEL, TILE_64, );
1863*35ffd701SAndroid Build Coastguard Worker                         }
1864*35ffd701SAndroid Build Coastguard Worker                     }
1865*35ffd701SAndroid Build Coastguard Worker                 }
1866*35ffd701SAndroid Build Coastguard Worker             }
1867*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(SwizzledSurface.pSwizzle);
1868*35ffd701SAndroid Build Coastguard Worker 
1869*35ffd701SAndroid Build Coastguard Worker             if(pBlt->Blt.Upload)
1870*35ffd701SAndroid Build Coastguard Worker             {
1871*35ffd701SAndroid Build Coastguard Worker                 CpuSwizzleBlt(&SwizzledSurface, &LinearSurface, __CopyWidthBytes, __CopyHeight);
1872*35ffd701SAndroid Build Coastguard Worker             }
1873*35ffd701SAndroid Build Coastguard Worker             else
1874*35ffd701SAndroid Build Coastguard Worker             {
1875*35ffd701SAndroid Build Coastguard Worker                 CpuSwizzleBlt(&LinearSurface, &SwizzledSurface, __CopyWidthBytes, __CopyHeight);
1876*35ffd701SAndroid Build Coastguard Worker             }
1877*35ffd701SAndroid Build Coastguard Worker         }
1878*35ffd701SAndroid Build Coastguard Worker     }
1879*35ffd701SAndroid Build Coastguard Worker 
1880*35ffd701SAndroid Build Coastguard Worker EXIT:
1881*35ffd701SAndroid Build Coastguard Worker 
1882*35ffd701SAndroid Build Coastguard Worker     return Success;
1883*35ffd701SAndroid Build Coastguard Worker }
1884*35ffd701SAndroid Build Coastguard Worker 
1885*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1886*35ffd701SAndroid Build Coastguard Worker /// Helper function that helps UMDs map in the surface in a layout that
1887*35ffd701SAndroid Build Coastguard Worker /// our HW understands. Clients call this function in a loop until it
1888*35ffd701SAndroid Build Coastguard Worker /// returns failure. Clients will get back information in pMapping->Span,
1889*35ffd701SAndroid Build Coastguard Worker /// which they can use to map Span.Size bytes to Span.VirtualOffset gfx
1890*35ffd701SAndroid Build Coastguard Worker /// address with Span.PhysicalOffset physical page.
1891*35ffd701SAndroid Build Coastguard Worker ///
1892*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pMapping: Clients call the function with initially zero'd out GMM_GET_MAPPING.
1893*35ffd701SAndroid Build Coastguard Worker /// @return      1 if more span descriptors to report, 0 if all mapping is done
1894*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMappingSpanDesc(GMM_GET_MAPPING * pMapping)1895*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetMappingSpanDesc(GMM_GET_MAPPING *pMapping)
1896*35ffd701SAndroid Build Coastguard Worker {
1897*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform;
1898*35ffd701SAndroid Build Coastguard Worker     uint8_t                  WasFinalSpan = 0;
1899*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_INFO *       pTexInfo;
1900*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *       pTextureCalc;
1901*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_INFO         RedescribedPlaneInfo;
1902*35ffd701SAndroid Build Coastguard Worker     bool Aux = false;
1903*35ffd701SAndroid Build Coastguard Worker 
1904*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(Surf.Flags.Info.StdSwizzle);
1905*35ffd701SAndroid Build Coastguard Worker 
1906*35ffd701SAndroid Build Coastguard Worker     pPlatform    = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
1907*35ffd701SAndroid Build Coastguard Worker     pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
1908*35ffd701SAndroid Build Coastguard Worker 
1909*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pTextureCalc != NULL);
1910*35ffd701SAndroid Build Coastguard Worker     pTexInfo = &Surf;
1911*35ffd701SAndroid Build Coastguard Worker 
1912*35ffd701SAndroid Build Coastguard Worker     if((pMapping->Type == GMM_MAPPING_YUVPLANAR_AUX || pMapping->Type == GMM_MAPPING_YUVPLANAR) && GmmIsPlanar(Surf.Format))
1913*35ffd701SAndroid Build Coastguard Worker     {
1914*35ffd701SAndroid Build Coastguard Worker         uint32_t            Plane;
1915*35ffd701SAndroid Build Coastguard Worker         GMM_REQ_OFFSET_INFO ReqInfo = {0}, NextSpanReqInfo = {0};
1916*35ffd701SAndroid Build Coastguard Worker         GMM_GFX_SIZE_T      SpanPhysicalOffset, SpanVirtualOffset;
1917*35ffd701SAndroid Build Coastguard Worker 
1918*35ffd701SAndroid Build Coastguard Worker         if(pMapping->Type == GMM_MAPPING_YUVPLANAR_AUX)
1919*35ffd701SAndroid Build Coastguard Worker         {
1920*35ffd701SAndroid Build Coastguard Worker             // Unpack GMM_MAPPING_YUVPLANAR and Aux from caller function.
1921*35ffd701SAndroid Build Coastguard Worker             // Applicalble only for Aux mapping for Y/UV Plane
1922*35ffd701SAndroid Build Coastguard Worker             // GMM_MAPPING_YUVPLANAR_AUX is unpacked as (GMM_MAPPING_YUVPLANAR , Aux)
1923*35ffd701SAndroid Build Coastguard Worker             Aux = true;
1924*35ffd701SAndroid Build Coastguard Worker         }
1925*35ffd701SAndroid Build Coastguard Worker 
1926*35ffd701SAndroid Build Coastguard Worker 	if(Aux)
1927*35ffd701SAndroid Build Coastguard Worker         {
1928*35ffd701SAndroid Build Coastguard Worker             memset(pMapping, 0, sizeof(*pMapping));
1929*35ffd701SAndroid Build Coastguard Worker             pMapping->Type                  = GMM_MAPPING_YUVPLANAR;
1930*35ffd701SAndroid Build Coastguard Worker             WasFinalSpan                    = 1;
1931*35ffd701SAndroid Build Coastguard Worker             SpanPhysicalOffset              = GetSizeMainSurfacePhysical();
1932*35ffd701SAndroid Build Coastguard Worker             SpanVirtualOffset               = GetSizeMainSurface();
1933*35ffd701SAndroid Build Coastguard Worker             NextSpanReqInfo.Lock.Offset64   = SpanPhysicalOffset + GetSizeAuxSurface(GMM_AUX_SURF);
1934*35ffd701SAndroid Build Coastguard Worker             NextSpanReqInfo.Render.Offset64 = GetSizeSurface();
1935*35ffd701SAndroid Build Coastguard Worker         }
1936*35ffd701SAndroid Build Coastguard Worker         else
1937*35ffd701SAndroid Build Coastguard Worker         {
1938*35ffd701SAndroid Build Coastguard Worker             if(pMapping->Scratch.Plane == GMM_NO_PLANE)
1939*35ffd701SAndroid Build Coastguard Worker             {
1940*35ffd701SAndroid Build Coastguard Worker                 uint32_t ArrayIndex = pMapping->Scratch.Slice;
1941*35ffd701SAndroid Build Coastguard Worker                 memset(pMapping, 0, sizeof(*pMapping));
1942*35ffd701SAndroid Build Coastguard Worker                 pMapping->Type = GMM_MAPPING_YUVPLANAR;
1943*35ffd701SAndroid Build Coastguard Worker 		pMapping->Scratch.Plane      = GMM_PLANE_Y;
1944*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Slice = ArrayIndex;
1945*35ffd701SAndroid Build Coastguard Worker 
1946*35ffd701SAndroid Build Coastguard Worker                 SpanPhysicalOffset = SpanVirtualOffset = 0;
1947*35ffd701SAndroid Build Coastguard Worker                 if(GmmLib::Utility::GmmGetNumPlanes(Surf.Format) == GMM_PLANE_V)
1948*35ffd701SAndroid Build Coastguard Worker                 {
1949*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.LastPlane = GMM_PLANE_V;
1950*35ffd701SAndroid Build Coastguard Worker                 }
1951*35ffd701SAndroid Build Coastguard Worker                 else
1952*35ffd701SAndroid Build Coastguard Worker                 {
1953*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.LastPlane = GMM_PLANE_U;
1954*35ffd701SAndroid Build Coastguard Worker                 }
1955*35ffd701SAndroid Build Coastguard Worker 
1956*35ffd701SAndroid Build Coastguard Worker                 Plane = pMapping->Scratch.Plane;
1957*35ffd701SAndroid Build Coastguard Worker             }
1958*35ffd701SAndroid Build Coastguard Worker             else
1959*35ffd701SAndroid Build Coastguard Worker             {
1960*35ffd701SAndroid Build Coastguard Worker                 // If we've crossed into a new plane then need to reset
1961*35ffd701SAndroid Build Coastguard Worker                 // the current mapping info and adjust the mapping
1962*35ffd701SAndroid Build Coastguard Worker                 // params accordingly
1963*35ffd701SAndroid Build Coastguard Worker 
1964*35ffd701SAndroid Build Coastguard Worker                 Plane                   = pMapping->Scratch.Plane + 1;
1965*35ffd701SAndroid Build Coastguard Worker                 GMM_YUV_PLANE LastPlane = pMapping->Scratch.LastPlane;
1966*35ffd701SAndroid Build Coastguard Worker                 SpanPhysicalOffset      = pMapping->__NextSpan.PhysicalOffset;
1967*35ffd701SAndroid Build Coastguard Worker                 SpanVirtualOffset       = pMapping->__NextSpan.VirtualOffset;
1968*35ffd701SAndroid Build Coastguard Worker                 uint32_t ArrayIndex     = pMapping->Scratch.Slice;
1969*35ffd701SAndroid Build Coastguard Worker                 memset(pMapping, 0, sizeof(*pMapping));
1970*35ffd701SAndroid Build Coastguard Worker 
1971*35ffd701SAndroid Build Coastguard Worker                 pMapping->Type               = GMM_MAPPING_YUVPLANAR;
1972*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Plane      = GMM_YUV_PLANE(Plane);
1973*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.LastPlane  = LastPlane;
1974*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Slice     = ArrayIndex;
1975*35ffd701SAndroid Build Coastguard Worker             }
1976*35ffd701SAndroid Build Coastguard Worker             {
1977*35ffd701SAndroid Build Coastguard Worker                 if(pMapping->Scratch.Plane == GMM_PLANE_Y)
1978*35ffd701SAndroid Build Coastguard Worker                 {
1979*35ffd701SAndroid Build Coastguard Worker                     ReqInfo.ReqRender = ReqInfo.ReqLock = 1;
1980*35ffd701SAndroid Build Coastguard Worker                     ReqInfo.Plane                       = GMM_YUV_PLANE(Plane);
1981*35ffd701SAndroid Build Coastguard Worker                     ReqInfo.ArrayIndex                  = pMapping->Scratch.Slice;
1982*35ffd701SAndroid Build Coastguard Worker                     this->GetOffset(ReqInfo);
1983*35ffd701SAndroid Build Coastguard Worker                     SpanPhysicalOffset = ReqInfo.Lock.Offset64;
1984*35ffd701SAndroid Build Coastguard Worker                     SpanVirtualOffset  = ReqInfo.Render.Offset64;
1985*35ffd701SAndroid Build Coastguard Worker                 }
1986*35ffd701SAndroid Build Coastguard Worker                 if(GMM_YUV_PLANE(Plane) < pMapping->Scratch.LastPlane)
1987*35ffd701SAndroid Build Coastguard Worker                 {
1988*35ffd701SAndroid Build Coastguard Worker                     NextSpanReqInfo.ReqRender = NextSpanReqInfo.ReqLock = 1;
1989*35ffd701SAndroid Build Coastguard Worker                     NextSpanReqInfo.Plane                               = GMM_YUV_PLANE(Plane + 1);
1990*35ffd701SAndroid Build Coastguard Worker                     NextSpanReqInfo.ArrayIndex                          = pMapping->Scratch.Slice;
1991*35ffd701SAndroid Build Coastguard Worker                     this->GetOffset(NextSpanReqInfo);
1992*35ffd701SAndroid Build Coastguard Worker                 }
1993*35ffd701SAndroid Build Coastguard Worker                 else // last plane of that array
1994*35ffd701SAndroid Build Coastguard Worker                 {
1995*35ffd701SAndroid Build Coastguard Worker                     NextSpanReqInfo.Lock.Offset64   = (GetSizeMainSurfacePhysical() / GFX_MAX(Surf.ArraySize, 1)) * (pMapping->Scratch.Slice + 1);
1996*35ffd701SAndroid Build Coastguard Worker                     NextSpanReqInfo.Render.Offset64 = (GetSizeMainSurface() / GFX_MAX(Surf.ArraySize, 1)) * (pMapping->Scratch.Slice + 1);
1997*35ffd701SAndroid Build Coastguard Worker                     WasFinalSpan                    = 1;
1998*35ffd701SAndroid Build Coastguard Worker                 }
1999*35ffd701SAndroid Build Coastguard Worker             }
2000*35ffd701SAndroid Build Coastguard Worker         }
2001*35ffd701SAndroid Build Coastguard Worker         // Plane offsets
2002*35ffd701SAndroid Build Coastguard Worker         pMapping->Span.PhysicalOffset       = SpanPhysicalOffset;
2003*35ffd701SAndroid Build Coastguard Worker         pMapping->Span.VirtualOffset        = SpanVirtualOffset;
2004*35ffd701SAndroid Build Coastguard Worker         pMapping->__NextSpan.PhysicalOffset = NextSpanReqInfo.Lock.Offset64;
2005*35ffd701SAndroid Build Coastguard Worker         pMapping->__NextSpan.VirtualOffset  = NextSpanReqInfo.Render.Offset64;
2006*35ffd701SAndroid Build Coastguard Worker         pMapping->Span.Size                 = pMapping->__NextSpan.PhysicalOffset - pMapping->Span.PhysicalOffset;
2007*35ffd701SAndroid Build Coastguard Worker 
2008*35ffd701SAndroid Build Coastguard Worker     }
2009*35ffd701SAndroid Build Coastguard Worker     else if(pMapping->Type == GMM_MAPPING_GEN9_YS_TO_STDSWIZZLE)
2010*35ffd701SAndroid Build Coastguard Worker     {
2011*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(Surf.Flags.Info.StdSwizzle);
2012*35ffd701SAndroid Build Coastguard Worker 
2013*35ffd701SAndroid Build Coastguard Worker         const uint32_t TileSize = GMM_KBYTE(64);
2014*35ffd701SAndroid Build Coastguard Worker 
2015*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(Surf.Flags.Info.TiledYs);
2016*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(
2017*35ffd701SAndroid Build Coastguard Worker         (Surf.Type == RESOURCE_2D) ||
2018*35ffd701SAndroid Build Coastguard Worker         (Surf.Type == RESOURCE_3D) ||
2019*35ffd701SAndroid Build Coastguard Worker         (Surf.Type == RESOURCE_CUBE));
2020*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(Surf.Flags.Gpu.Depth == 0); // TODO(Minor): Proper StdSwizzle exemptions?
2021*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(Surf.Flags.Gpu.SeparateStencil == 0);
2022*35ffd701SAndroid Build Coastguard Worker 
2023*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(AuxSurf.Size == 0);       // TODO(Medium): Support not yet implemented, but DX12 UMD not using yet.
2024*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(Surf.Flags.Gpu.MMC == 0); // TODO(Medium): Support not yet implemented, but not yet needed for DX12.
2025*35ffd701SAndroid Build Coastguard Worker 
2026*35ffd701SAndroid Build Coastguard Worker         // For planar surfaces we need to reorder the planes into what HW expects.
2027*35ffd701SAndroid Build Coastguard Worker         // OS will provide planes in [Y0][Y1][U0][U1][V0][V1] order while
2028*35ffd701SAndroid Build Coastguard Worker         // HW requires them to be in [Y0][U0][V0][Y1][U1][V1] order
2029*35ffd701SAndroid Build Coastguard Worker         if(Surf.Flags.Info.RedecribedPlanes)
2030*35ffd701SAndroid Build Coastguard Worker         {
2031*35ffd701SAndroid Build Coastguard Worker             if(pMapping->Scratch.Plane == GMM_NO_PLANE)
2032*35ffd701SAndroid Build Coastguard Worker             {
2033*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Plane = GMM_PLANE_Y;
2034*35ffd701SAndroid Build Coastguard Worker                 if(GmmLib::Utility::GmmGetNumPlanes(Surf.Format) == GMM_PLANE_V)
2035*35ffd701SAndroid Build Coastguard Worker                 {
2036*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.LastPlane = GMM_PLANE_V;
2037*35ffd701SAndroid Build Coastguard Worker                 }
2038*35ffd701SAndroid Build Coastguard Worker                 else
2039*35ffd701SAndroid Build Coastguard Worker                 {
2040*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.LastPlane = GMM_PLANE_U;
2041*35ffd701SAndroid Build Coastguard Worker                 }
2042*35ffd701SAndroid Build Coastguard Worker             }
2043*35ffd701SAndroid Build Coastguard Worker             else if(pMapping->Scratch.Row == pMapping->Scratch.Rows)
2044*35ffd701SAndroid Build Coastguard Worker             {
2045*35ffd701SAndroid Build Coastguard Worker                 // If we've crossed into a new plane then need to reset
2046*35ffd701SAndroid Build Coastguard Worker                 // the current mapping info and adjust the mapping
2047*35ffd701SAndroid Build Coastguard Worker                 // params accordingly
2048*35ffd701SAndroid Build Coastguard Worker                 GMM_REQ_OFFSET_INFO ReqInfo   = {0};
2049*35ffd701SAndroid Build Coastguard Worker                 uint32_t            Plane     = pMapping->Scratch.Plane + 1;
2050*35ffd701SAndroid Build Coastguard Worker                 GMM_YUV_PLANE       LastPlane = pMapping->Scratch.LastPlane;
2051*35ffd701SAndroid Build Coastguard Worker 
2052*35ffd701SAndroid Build Coastguard Worker                 memset(pMapping, 0, sizeof(*pMapping));
2053*35ffd701SAndroid Build Coastguard Worker 
2054*35ffd701SAndroid Build Coastguard Worker                 pMapping->Type              = GMM_MAPPING_GEN9_YS_TO_STDSWIZZLE;
2055*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Plane     = GMM_YUV_PLANE(Plane);
2056*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.LastPlane = LastPlane;
2057*35ffd701SAndroid Build Coastguard Worker 
2058*35ffd701SAndroid Build Coastguard Worker                 ReqInfo.ReqRender = ReqInfo.ReqStdLayout = 1;
2059*35ffd701SAndroid Build Coastguard Worker                 ReqInfo.Plane                            = GMM_YUV_PLANE(Plane);
2060*35ffd701SAndroid Build Coastguard Worker 
2061*35ffd701SAndroid Build Coastguard Worker                 this->GetOffset(ReqInfo);
2062*35ffd701SAndroid Build Coastguard Worker 
2063*35ffd701SAndroid Build Coastguard Worker                 pMapping->__NextSpan.PhysicalOffset = ReqInfo.StdLayout.Offset;
2064*35ffd701SAndroid Build Coastguard Worker                 pMapping->__NextSpan.VirtualOffset  = ReqInfo.Render.Offset64;
2065*35ffd701SAndroid Build Coastguard Worker             }
2066*35ffd701SAndroid Build Coastguard Worker 
2067*35ffd701SAndroid Build Coastguard Worker 	    pTextureCalc->GetRedescribedPlaneParams(pTexInfo, GMM_PLANE_Y, &RedescribedPlaneInfo);
2068*35ffd701SAndroid Build Coastguard Worker             pTexInfo = &RedescribedPlaneInfo;
2069*35ffd701SAndroid Build Coastguard Worker 
2070*35ffd701SAndroid Build Coastguard Worker         }
2071*35ffd701SAndroid Build Coastguard Worker 
2072*35ffd701SAndroid Build Coastguard Worker         // Initialization of Mapping Params...
2073*35ffd701SAndroid Build Coastguard Worker         if(pMapping->Scratch.Element.Width == 0) // i.e. initially zero'ed struct.
2074*35ffd701SAndroid Build Coastguard Worker         {
2075*35ffd701SAndroid Build Coastguard Worker             uint32_t BytesPerElement = pTexInfo->BitsPerPixel / CHAR_BIT;
2076*35ffd701SAndroid Build Coastguard Worker 
2077*35ffd701SAndroid Build Coastguard Worker             pMapping->Scratch.EffectiveLodMax = GFX_MIN(pTexInfo->MaxLod, pTexInfo->Alignment.MipTailStartLod);
2078*35ffd701SAndroid Build Coastguard Worker 
2079*35ffd701SAndroid Build Coastguard Worker             pTextureCalc->GetCompressionBlockDimensions(
2080*35ffd701SAndroid Build Coastguard Worker             pTexInfo->Format,
2081*35ffd701SAndroid Build Coastguard Worker             &pMapping->Scratch.Element.Width,
2082*35ffd701SAndroid Build Coastguard Worker             &pMapping->Scratch.Element.Height,
2083*35ffd701SAndroid Build Coastguard Worker             &pMapping->Scratch.Element.Depth);
2084*35ffd701SAndroid Build Coastguard Worker 
2085*35ffd701SAndroid Build Coastguard Worker             { // Tile Dimensions...
2086*35ffd701SAndroid Build Coastguard Worker                 GMM_TILE_MODE TileMode = pTexInfo->TileMode;
2087*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(TileMode < GMM_TILE_MODES);
2088*35ffd701SAndroid Build Coastguard Worker 
2089*35ffd701SAndroid Build Coastguard Worker                 // Get Tile Logical Tile Dimensions (i.e. uncompressed pixels)...
2090*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Tile.Width =
2091*35ffd701SAndroid Build Coastguard Worker                 (pPlatform->TileInfo[TileMode].LogicalTileWidth / BytesPerElement) *
2092*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Element.Width;
2093*35ffd701SAndroid Build Coastguard Worker 
2094*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Tile.Height =
2095*35ffd701SAndroid Build Coastguard Worker                 pPlatform->TileInfo[TileMode].LogicalTileHeight *
2096*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Element.Height;
2097*35ffd701SAndroid Build Coastguard Worker 
2098*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Tile.Depth =
2099*35ffd701SAndroid Build Coastguard Worker                 pPlatform->TileInfo[TileMode].LogicalTileDepth *
2100*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Element.Depth;
2101*35ffd701SAndroid Build Coastguard Worker 
2102*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.RowPitchVirtual =
2103*35ffd701SAndroid Build Coastguard Worker                 GFX_ULONG_CAST(pTexInfo->Pitch) *
2104*35ffd701SAndroid Build Coastguard Worker                 pPlatform->TileInfo[TileMode].LogicalTileHeight *
2105*35ffd701SAndroid Build Coastguard Worker                 pPlatform->TileInfo[TileMode].LogicalTileDepth;
2106*35ffd701SAndroid Build Coastguard Worker             }
2107*35ffd701SAndroid Build Coastguard Worker 
2108*35ffd701SAndroid Build Coastguard Worker             { // Slice...
2109*35ffd701SAndroid Build Coastguard Worker                 uint32_t Lod;
2110*35ffd701SAndroid Build Coastguard Worker                 uint32_t LodsPerSlice =
2111*35ffd701SAndroid Build Coastguard Worker                 (pTexInfo->Type != RESOURCE_3D) ?
2112*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.EffectiveLodMax + 1 :
2113*35ffd701SAndroid Build Coastguard Worker                 1; // 3D Std Swizzle traverses slices before MIP's.
2114*35ffd701SAndroid Build Coastguard Worker 
2115*35ffd701SAndroid Build Coastguard Worker                 if(pMapping->Scratch.Plane)
2116*35ffd701SAndroid Build Coastguard Worker                 {
2117*35ffd701SAndroid Build Coastguard Worker                     // If planar then we need the parent descriptors planar pitch
2118*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.SlicePitch.Virtual =
2119*35ffd701SAndroid Build Coastguard Worker                     GFX_ULONG_CAST(Surf.OffsetInfo.Plane.ArrayQPitch) *
2120*35ffd701SAndroid Build Coastguard Worker                     (pMapping->Scratch.Tile.Depth / pMapping->Scratch.Element.Depth);
2121*35ffd701SAndroid Build Coastguard Worker                 }
2122*35ffd701SAndroid Build Coastguard Worker                 else
2123*35ffd701SAndroid Build Coastguard Worker                 {
2124*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.SlicePitch.Virtual =
2125*35ffd701SAndroid Build Coastguard Worker                     GFX_ULONG_CAST(pTexInfo->OffsetInfo.Texture2DOffsetInfo.ArrayQPitchRender) *
2126*35ffd701SAndroid Build Coastguard Worker                     (pMapping->Scratch.Tile.Depth / pMapping->Scratch.Element.Depth);
2127*35ffd701SAndroid Build Coastguard Worker                 }
2128*35ffd701SAndroid Build Coastguard Worker 
2129*35ffd701SAndroid Build Coastguard Worker                 // SlicePitch.Physical...
2130*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(pMapping->Scratch.SlicePitch.Physical == 0);
2131*35ffd701SAndroid Build Coastguard Worker                 for(Lod = 0; Lod < LodsPerSlice; Lod++)
2132*35ffd701SAndroid Build Coastguard Worker                 {
2133*35ffd701SAndroid Build Coastguard Worker                     uint32_t       MipCols, MipRows;
2134*35ffd701SAndroid Build Coastguard Worker                     GMM_GFX_SIZE_T MipWidth;
2135*35ffd701SAndroid Build Coastguard Worker                     uint32_t       MipHeight;
2136*35ffd701SAndroid Build Coastguard Worker 
2137*35ffd701SAndroid Build Coastguard Worker                     MipWidth  = pTextureCalc->GmmTexGetMipWidth(pTexInfo, Lod);
2138*35ffd701SAndroid Build Coastguard Worker                     MipHeight = pTextureCalc->GmmTexGetMipHeight(pTexInfo, Lod);
2139*35ffd701SAndroid Build Coastguard Worker 
2140*35ffd701SAndroid Build Coastguard Worker                     MipCols = GFX_ULONG_CAST(
2141*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(
2142*35ffd701SAndroid Build Coastguard Worker                     MipWidth,
2143*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Tile.Width));
2144*35ffd701SAndroid Build Coastguard Worker                     MipRows =
2145*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(
2146*35ffd701SAndroid Build Coastguard Worker                     MipHeight,
2147*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Tile.Height);
2148*35ffd701SAndroid Build Coastguard Worker 
2149*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.SlicePitch.Physical +=
2150*35ffd701SAndroid Build Coastguard Worker                     MipCols * MipRows * TileSize;
2151*35ffd701SAndroid Build Coastguard Worker                 }
2152*35ffd701SAndroid Build Coastguard Worker             }
2153*35ffd701SAndroid Build Coastguard Worker 
2154*35ffd701SAndroid Build Coastguard Worker             { // Mip0...
2155*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->Type != RESOURCE_3D)
2156*35ffd701SAndroid Build Coastguard Worker                 {
2157*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Slices =
2158*35ffd701SAndroid Build Coastguard Worker                     GFX_MAX(pTexInfo->ArraySize, 1) *
2159*35ffd701SAndroid Build Coastguard Worker                     ((pTexInfo->Type == RESOURCE_CUBE) ? 6 : 1);
2160*35ffd701SAndroid Build Coastguard Worker                 }
2161*35ffd701SAndroid Build Coastguard Worker                 else
2162*35ffd701SAndroid Build Coastguard Worker                 {
2163*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Slices =
2164*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(pTexInfo->Depth, pMapping->Scratch.Tile.Depth);
2165*35ffd701SAndroid Build Coastguard Worker                 }
2166*35ffd701SAndroid Build Coastguard Worker 
2167*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->Pitch ==
2168*35ffd701SAndroid Build Coastguard Worker                    (GFX_ALIGN(pTexInfo->BaseWidth, pMapping->Scratch.Tile.Width) /
2169*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Element.Width * BytesPerElement))
2170*35ffd701SAndroid Build Coastguard Worker                 {
2171*35ffd701SAndroid Build Coastguard Worker                     // Treat Each LOD0 MIP as Single, Large Mapping Row...
2172*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Rows = 1;
2173*35ffd701SAndroid Build Coastguard Worker 
2174*35ffd701SAndroid Build Coastguard Worker                     pMapping->__NextSpan.Size =
2175*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(pTexInfo->BaseWidth, pMapping->Scratch.Tile.Width) *
2176*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(pTexInfo->BaseHeight, pMapping->Scratch.Tile.Height) *
2177*35ffd701SAndroid Build Coastguard Worker                     TileSize;
2178*35ffd701SAndroid Build Coastguard Worker                 }
2179*35ffd701SAndroid Build Coastguard Worker                 else
2180*35ffd701SAndroid Build Coastguard Worker                 {
2181*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Rows =
2182*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(pTexInfo->BaseHeight, pMapping->Scratch.Tile.Height);
2183*35ffd701SAndroid Build Coastguard Worker 
2184*35ffd701SAndroid Build Coastguard Worker                     pMapping->__NextSpan.Size =
2185*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(pTexInfo->BaseWidth, pMapping->Scratch.Tile.Width) *
2186*35ffd701SAndroid Build Coastguard Worker                     TileSize;
2187*35ffd701SAndroid Build Coastguard Worker                 }
2188*35ffd701SAndroid Build Coastguard Worker             }
2189*35ffd701SAndroid Build Coastguard Worker         }
2190*35ffd701SAndroid Build Coastguard Worker 
2191*35ffd701SAndroid Build Coastguard Worker         // This iteration's span descriptor...
2192*35ffd701SAndroid Build Coastguard Worker         pMapping->Span = pMapping->__NextSpan;
2193*35ffd701SAndroid Build Coastguard Worker 
2194*35ffd701SAndroid Build Coastguard Worker         // Prepare for Next Iteration...
2195*35ffd701SAndroid Build Coastguard Worker         //  for(Lod = 0; Lod <= EffectiveLodMax; Lod += 1)
2196*35ffd701SAndroid Build Coastguard Worker         //  for(Row = 0; Row < Rows; Row += 1)
2197*35ffd701SAndroid Build Coastguard Worker         //  for(Slice = 0; Slice < Slices; Slice += 1)
2198*35ffd701SAndroid Build Coastguard Worker         if((pMapping->Scratch.Slice += 1) < pMapping->Scratch.Slices)
2199*35ffd701SAndroid Build Coastguard Worker         {
2200*35ffd701SAndroid Build Coastguard Worker             pMapping->__NextSpan.PhysicalOffset += pMapping->Scratch.SlicePitch.Physical;
2201*35ffd701SAndroid Build Coastguard Worker             pMapping->__NextSpan.VirtualOffset += pMapping->Scratch.SlicePitch.Virtual;
2202*35ffd701SAndroid Build Coastguard Worker         }
2203*35ffd701SAndroid Build Coastguard Worker         else
2204*35ffd701SAndroid Build Coastguard Worker         {
2205*35ffd701SAndroid Build Coastguard Worker             pMapping->Scratch.Slice = 0;
2206*35ffd701SAndroid Build Coastguard Worker 
2207*35ffd701SAndroid Build Coastguard Worker             if((pMapping->Scratch.Row += 1) < pMapping->Scratch.Rows)
2208*35ffd701SAndroid Build Coastguard Worker             {
2209*35ffd701SAndroid Build Coastguard Worker                 pMapping->__NextSpan.PhysicalOffset =
2210*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Slice0MipOffset.Physical += pMapping->Span.Size;
2211*35ffd701SAndroid Build Coastguard Worker 
2212*35ffd701SAndroid Build Coastguard Worker                 pMapping->__NextSpan.VirtualOffset =
2213*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Slice0MipOffset.Virtual += pMapping->Scratch.RowPitchVirtual;
2214*35ffd701SAndroid Build Coastguard Worker             }
2215*35ffd701SAndroid Build Coastguard Worker             else if((pMapping->Scratch.Lod += 1) <= pMapping->Scratch.EffectiveLodMax)
2216*35ffd701SAndroid Build Coastguard Worker             {
2217*35ffd701SAndroid Build Coastguard Worker                 GMM_REQ_OFFSET_INFO GetOffset = {0};
2218*35ffd701SAndroid Build Coastguard Worker                 GMM_GFX_SIZE_T      MipWidth;
2219*35ffd701SAndroid Build Coastguard Worker                 uint32_t            MipHeight, MipCols;
2220*35ffd701SAndroid Build Coastguard Worker 
2221*35ffd701SAndroid Build Coastguard Worker                 MipWidth  = pTextureCalc->GmmTexGetMipWidth(pTexInfo, pMapping->Scratch.Lod);
2222*35ffd701SAndroid Build Coastguard Worker                 MipHeight = pTextureCalc->GmmTexGetMipHeight(pTexInfo, pMapping->Scratch.Lod);
2223*35ffd701SAndroid Build Coastguard Worker 
2224*35ffd701SAndroid Build Coastguard Worker                 MipCols = GFX_ULONG_CAST(
2225*35ffd701SAndroid Build Coastguard Worker                 GFX_CEIL_DIV(
2226*35ffd701SAndroid Build Coastguard Worker                 MipWidth,
2227*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Tile.Width));
2228*35ffd701SAndroid Build Coastguard Worker 
2229*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Row = 0;
2230*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Rows =
2231*35ffd701SAndroid Build Coastguard Worker                 GFX_CEIL_DIV(
2232*35ffd701SAndroid Build Coastguard Worker                 MipHeight,
2233*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Tile.Height);
2234*35ffd701SAndroid Build Coastguard Worker 
2235*35ffd701SAndroid Build Coastguard Worker                 if(pTexInfo->Type != RESOURCE_3D)
2236*35ffd701SAndroid Build Coastguard Worker                 {
2237*35ffd701SAndroid Build Coastguard Worker                     pMapping->__NextSpan.PhysicalOffset =
2238*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Slice0MipOffset.Physical += pMapping->Span.Size;
2239*35ffd701SAndroid Build Coastguard Worker                 }
2240*35ffd701SAndroid Build Coastguard Worker                 else
2241*35ffd701SAndroid Build Coastguard Worker                 {
2242*35ffd701SAndroid Build Coastguard Worker                     uint32_t MipDepth;
2243*35ffd701SAndroid Build Coastguard Worker 
2244*35ffd701SAndroid Build Coastguard Worker                     MipDepth = pTextureCalc->GmmTexGetMipDepth(pTexInfo, pMapping->Scratch.Lod);
2245*35ffd701SAndroid Build Coastguard Worker 
2246*35ffd701SAndroid Build Coastguard Worker                     // 3D Std Swizzle traverses slices before MIP's...
2247*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Slice0MipOffset.Physical =
2248*35ffd701SAndroid Build Coastguard Worker                     pMapping->__NextSpan.PhysicalOffset += pMapping->Span.Size;
2249*35ffd701SAndroid Build Coastguard Worker 
2250*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Slices =
2251*35ffd701SAndroid Build Coastguard Worker                     GFX_CEIL_DIV(
2252*35ffd701SAndroid Build Coastguard Worker                     MipDepth,
2253*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.Tile.Depth);
2254*35ffd701SAndroid Build Coastguard Worker 
2255*35ffd701SAndroid Build Coastguard Worker                     pMapping->Scratch.SlicePitch.Physical =
2256*35ffd701SAndroid Build Coastguard Worker                     MipCols * pMapping->Scratch.Rows * TileSize;
2257*35ffd701SAndroid Build Coastguard Worker                 }
2258*35ffd701SAndroid Build Coastguard Worker 
2259*35ffd701SAndroid Build Coastguard Worker                 GetOffset.ReqRender = 1;
2260*35ffd701SAndroid Build Coastguard Worker                 GetOffset.MipLevel  = pMapping->Scratch.Lod;
2261*35ffd701SAndroid Build Coastguard Worker                 this->GetOffset(GetOffset);
2262*35ffd701SAndroid Build Coastguard Worker 
2263*35ffd701SAndroid Build Coastguard Worker                 pMapping->__NextSpan.VirtualOffset =
2264*35ffd701SAndroid Build Coastguard Worker                 pMapping->Scratch.Slice0MipOffset.Virtual =
2265*35ffd701SAndroid Build Coastguard Worker                 GFX_ALIGN_FLOOR(GetOffset.Render.Offset64, TileSize); // Truncate for packed MIP Tail.
2266*35ffd701SAndroid Build Coastguard Worker 
2267*35ffd701SAndroid Build Coastguard Worker                 pMapping->__NextSpan.Size = MipCols * TileSize;
2268*35ffd701SAndroid Build Coastguard Worker             }
2269*35ffd701SAndroid Build Coastguard Worker             else
2270*35ffd701SAndroid Build Coastguard Worker             {
2271*35ffd701SAndroid Build Coastguard Worker                 // If the resource was a planar surface then need to iterate over the remaining planes
2272*35ffd701SAndroid Build Coastguard Worker                 WasFinalSpan = pMapping->Scratch.Plane == pMapping->Scratch.LastPlane;
2273*35ffd701SAndroid Build Coastguard Worker             }
2274*35ffd701SAndroid Build Coastguard Worker         }
2275*35ffd701SAndroid Build Coastguard Worker     }
2276*35ffd701SAndroid Build Coastguard Worker     else
2277*35ffd701SAndroid Build Coastguard Worker     {
2278*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(0);
2279*35ffd701SAndroid Build Coastguard Worker     }
2280*35ffd701SAndroid Build Coastguard Worker 
2281*35ffd701SAndroid Build Coastguard Worker     return !WasFinalSpan;
2282*35ffd701SAndroid Build Coastguard Worker }
2283*35ffd701SAndroid Build Coastguard Worker 
2284*35ffd701SAndroid Build Coastguard Worker //=============================================================================
2285*35ffd701SAndroid Build Coastguard Worker //
2286*35ffd701SAndroid Build Coastguard Worker // Function: GetTiledResourceMipPacking
2287*35ffd701SAndroid Build Coastguard Worker //
2288*35ffd701SAndroid Build Coastguard Worker // Desc: Get number of packed mips and total #tiles for packed mips
2289*35ffd701SAndroid Build Coastguard Worker //
2290*35ffd701SAndroid Build Coastguard Worker // Parameters:
2291*35ffd701SAndroid Build Coastguard Worker //      See function arguments.
2292*35ffd701SAndroid Build Coastguard Worker //
2293*35ffd701SAndroid Build Coastguard Worker // Returns:
2294*35ffd701SAndroid Build Coastguard Worker //      void
2295*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GetTiledResourceMipPacking(uint32_t * pNumPackedMips,uint32_t * pNumTilesForPackedMips)2296*35ffd701SAndroid Build Coastguard Worker void GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetTiledResourceMipPacking(uint32_t *pNumPackedMips,
2297*35ffd701SAndroid Build Coastguard Worker                                                                            uint32_t *pNumTilesForPackedMips)
2298*35ffd701SAndroid Build Coastguard Worker {
2299*35ffd701SAndroid Build Coastguard Worker     if(GetMaxLod() == 0)
2300*35ffd701SAndroid Build Coastguard Worker     {
2301*35ffd701SAndroid Build Coastguard Worker         *pNumPackedMips         = 0;
2302*35ffd701SAndroid Build Coastguard Worker         *pNumTilesForPackedMips = 0;
2303*35ffd701SAndroid Build Coastguard Worker         return;
2304*35ffd701SAndroid Build Coastguard Worker     }
2305*35ffd701SAndroid Build Coastguard Worker 
2306*35ffd701SAndroid Build Coastguard Worker     if(GetResFlags().Info.TiledYf ||
2307*35ffd701SAndroid Build Coastguard Worker        GMM_IS_64KB_TILE(GetResFlags()))
2308*35ffd701SAndroid Build Coastguard Worker     {
2309*35ffd701SAndroid Build Coastguard Worker         if(Surf.Alignment.MipTailStartLod == GMM_TILED_RESOURCE_NO_MIP_TAIL)
2310*35ffd701SAndroid Build Coastguard Worker         {
2311*35ffd701SAndroid Build Coastguard Worker             *pNumPackedMips         = 0;
2312*35ffd701SAndroid Build Coastguard Worker             *pNumTilesForPackedMips = 0;
2313*35ffd701SAndroid Build Coastguard Worker         }
2314*35ffd701SAndroid Build Coastguard Worker         else
2315*35ffd701SAndroid Build Coastguard Worker         {
2316*35ffd701SAndroid Build Coastguard Worker             *pNumPackedMips = GetMaxLod() -
2317*35ffd701SAndroid Build Coastguard Worker                               Surf.Alignment.MipTailStartLod + 1;
2318*35ffd701SAndroid Build Coastguard Worker             *pNumTilesForPackedMips = 1;
2319*35ffd701SAndroid Build Coastguard Worker         }
2320*35ffd701SAndroid Build Coastguard Worker     }
2321*35ffd701SAndroid Build Coastguard Worker     else
2322*35ffd701SAndroid Build Coastguard Worker     {
2323*35ffd701SAndroid Build Coastguard Worker         // Error, unsupported format.
2324*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(false);
2325*35ffd701SAndroid Build Coastguard Worker     }
2326*35ffd701SAndroid Build Coastguard Worker }
2327*35ffd701SAndroid Build Coastguard Worker 
2328*35ffd701SAndroid Build Coastguard Worker //=============================================================================
2329*35ffd701SAndroid Build Coastguard Worker //
2330*35ffd701SAndroid Build Coastguard Worker // Function: GetPackedMipTailStartLod
2331*35ffd701SAndroid Build Coastguard Worker //
2332*35ffd701SAndroid Build Coastguard Worker // Desc: Get Lod of first packed Mip.
2333*35ffd701SAndroid Build Coastguard Worker //
2334*35ffd701SAndroid Build Coastguard Worker // Parameters:
2335*35ffd701SAndroid Build Coastguard Worker //      See function arguments.
2336*35ffd701SAndroid Build Coastguard Worker //
2337*35ffd701SAndroid Build Coastguard Worker // Returns:
2338*35ffd701SAndroid Build Coastguard Worker //      Lod of first packed Mip
2339*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
GetPackedMipTailStartLod()2340*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetPackedMipTailStartLod()
2341*35ffd701SAndroid Build Coastguard Worker 
2342*35ffd701SAndroid Build Coastguard Worker {
2343*35ffd701SAndroid Build Coastguard Worker     uint32_t NumPackedMips = 0, NumTilesForPackedMips = 0;
2344*35ffd701SAndroid Build Coastguard Worker 
2345*35ffd701SAndroid Build Coastguard Worker     const GMM_PLATFORM_INFO *pPlatform = GMM_OVERRIDE_PLATFORM_INFO(&Surf, GetGmmLibContext());
2346*35ffd701SAndroid Build Coastguard Worker 
2347*35ffd701SAndroid Build Coastguard Worker     GetTiledResourceMipPacking(&NumPackedMips,
2348*35ffd701SAndroid Build Coastguard Worker                                &NumTilesForPackedMips);
2349*35ffd701SAndroid Build Coastguard Worker 
2350*35ffd701SAndroid Build Coastguard Worker     return (GetMaxLod() == 0) ?
2351*35ffd701SAndroid Build Coastguard Worker            pPlatform->MaxLod :
2352*35ffd701SAndroid Build Coastguard Worker            GetMaxLod() - NumPackedMips + 1; //GetMaxLod srarts at index 0, while NumPackedMips is just
2353*35ffd701SAndroid Build Coastguard Worker                                             //the number of mips. So + 1 to bring them to same units.
2354*35ffd701SAndroid Build Coastguard Worker }
2355*35ffd701SAndroid Build Coastguard Worker 
2356*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
2357*35ffd701SAndroid Build Coastguard Worker /// Verifies if all mips are RCC-aligned
2358*35ffd701SAndroid Build Coastguard Worker /// @return    true/false
2359*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
IsMipRCCAligned(uint8_t & MisAlignedLod)2360*35ffd701SAndroid Build Coastguard Worker bool GMM_STDCALL GmmLib::GmmResourceInfoCommon::IsMipRCCAligned(uint8_t &MisAlignedLod)
2361*35ffd701SAndroid Build Coastguard Worker {
2362*35ffd701SAndroid Build Coastguard Worker     const uint8_t RCCCachelineWidth  = 32;
2363*35ffd701SAndroid Build Coastguard Worker     const uint8_t RCCCachelineHeight = 4;
2364*35ffd701SAndroid Build Coastguard Worker 
2365*35ffd701SAndroid Build Coastguard Worker     for(uint8_t lod = 0; lod <= GetMaxLod(); lod++)
2366*35ffd701SAndroid Build Coastguard Worker     {
2367*35ffd701SAndroid Build Coastguard Worker         if(!(GFX_IS_ALIGNED(GetMipWidth(lod), RCCCachelineWidth) &&
2368*35ffd701SAndroid Build Coastguard Worker              GFX_IS_ALIGNED(GetMipHeight(lod), RCCCachelineHeight)))
2369*35ffd701SAndroid Build Coastguard Worker         {
2370*35ffd701SAndroid Build Coastguard Worker             MisAlignedLod = lod;
2371*35ffd701SAndroid Build Coastguard Worker             return false;
2372*35ffd701SAndroid Build Coastguard Worker         }
2373*35ffd701SAndroid Build Coastguard Worker     }
2374*35ffd701SAndroid Build Coastguard Worker     return true;
2375*35ffd701SAndroid Build Coastguard Worker }
2376*35ffd701SAndroid Build Coastguard Worker 
2377*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
2378*35ffd701SAndroid Build Coastguard Worker /// Return the logical width of mip level
2379*35ffd701SAndroid Build Coastguard Worker /// @param[in] MipLevel: Mip level for which the info is needed
2380*35ffd701SAndroid Build Coastguard Worker /// @return    Mip width
2381*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipWidth(uint32_t MipLevel)2382*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetMipWidth(uint32_t MipLevel)
2383*35ffd701SAndroid Build Coastguard Worker {
2384*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
2385*35ffd701SAndroid Build Coastguard Worker     return pTextureCalc->GmmTexGetMipWidth(&Surf, MipLevel);
2386*35ffd701SAndroid Build Coastguard Worker }
2387*35ffd701SAndroid Build Coastguard Worker 
2388*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
2389*35ffd701SAndroid Build Coastguard Worker /// Return the logical height of mip level
2390*35ffd701SAndroid Build Coastguard Worker /// @param[in] MipLevel: Mip level for which the info is needed
2391*35ffd701SAndroid Build Coastguard Worker /// @return    Mip width
2392*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipHeight(uint32_t MipLevel)2393*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetMipHeight(uint32_t MipLevel)
2394*35ffd701SAndroid Build Coastguard Worker {
2395*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
2396*35ffd701SAndroid Build Coastguard Worker     return pTextureCalc->GmmTexGetMipHeight(&Surf, MipLevel);
2397*35ffd701SAndroid Build Coastguard Worker }
2398*35ffd701SAndroid Build Coastguard Worker 
2399*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
2400*35ffd701SAndroid Build Coastguard Worker /// Return the logical depth of mip level
2401*35ffd701SAndroid Build Coastguard Worker /// @param[in] MipLevel Mip level for which the info is needed
2402*35ffd701SAndroid Build Coastguard Worker /// @return    Mip width
2403*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetMipDepth(uint32_t MipLevel)2404*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmResourceInfoCommon::GetMipDepth(uint32_t MipLevel)
2405*35ffd701SAndroid Build Coastguard Worker {
2406*35ffd701SAndroid Build Coastguard Worker     GMM_TEXTURE_CALC *pTextureCalc = GMM_OVERRIDE_TEXTURE_CALC(&Surf, GetGmmLibContext());
2407*35ffd701SAndroid Build Coastguard Worker     return pTextureCalc->GmmTexGetMipDepth(&Surf, MipLevel);
2408*35ffd701SAndroid Build Coastguard Worker }
2409