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