2
************************************************************************************************************************
4
* Copyright (C) 2007-2022 Advanced Micro Devices, Inc. All rights reserved.
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the "Software"),
8
* to deal in the Software without restriction, including without limitation
9
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
* and/or sell copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following conditions:
13
* The above copyright notice and this permission notice shall be included in
14
* all copies or substantial portions of the Software.
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
* OTHER DEALINGS IN THE SOFTWARE
24
***********************************************************************************************************************/
27
****************************************************************************************************
29
* @brief Contains the EgBasedLib class definition.
30
****************************************************************************************************
33
#ifndef __EG_BASED_ADDR_LIB_H__
34
#define __EG_BASED_ADDR_LIB_H__
42
/// Structures for functions
43
struct CoordFromBankPipe
58
****************************************************************************************************
59
* @brief This class is the Evergreen based address library
60
* @note Abstract class
61
****************************************************************************************************
63
class EgBasedLib : public Lib
66
EgBasedLib(const Client* pClient);
67
virtual ~EgBasedLib();
71
/// Surface info functions
73
// NOTE: DispatchComputeSurfaceInfo using TileInfo takes both an input and an output.
75
// One or more fields may be 0 to be calculated/defaulted - pre-SI h/w.
76
// H/W using tile mode index only accepts none or all 0's - SI and newer h/w.
77
// It then returns the actual tiling configuration used.
78
// Other methods' TileInfo must be valid on entry
79
BOOL_32 DispatchComputeSurfaceInfo(
80
const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
81
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const;
83
ADDR_E_RETURNCODE DispatchComputeFmaskInfo(
84
const ADDR_COMPUTE_FMASK_INFO_INPUT* pIn,
85
ADDR_COMPUTE_FMASK_INFO_OUTPUT* pOut);
89
virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfo(
90
const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
91
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const;
93
virtual ADDR_E_RETURNCODE HwlComputeSurfaceAddrFromCoord(
94
const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,
95
ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut) const;
97
virtual ADDR_E_RETURNCODE HwlComputeSurfaceCoordFromAddr(
98
const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,
99
ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut) const;
101
virtual ADDR_E_RETURNCODE HwlComputeSliceTileSwizzle(
102
const ADDR_COMPUTE_SLICESWIZZLE_INPUT* pIn,
103
ADDR_COMPUTE_SLICESWIZZLE_OUTPUT* pOut) const;
105
virtual ADDR_E_RETURNCODE HwlExtractBankPipeSwizzle(
106
const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT* pIn,
107
ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT* pOut) const;
109
virtual ADDR_E_RETURNCODE HwlCombineBankPipeSwizzle(
110
UINT_32 bankSwizzle, UINT_32 pipeSwizzle, ADDR_TILEINFO* pTileInfo,
111
UINT_64 baseAddr, UINT_32* pTileSwizzle) const;
113
virtual ADDR_E_RETURNCODE HwlComputeBaseSwizzle(
114
const ADDR_COMPUTE_BASE_SWIZZLE_INPUT* pIn,
115
ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT* pOut) const;
117
virtual ADDR_E_RETURNCODE HwlConvertTileInfoToHW(
118
const ADDR_CONVERT_TILEINFOTOHW_INPUT* pIn,
119
ADDR_CONVERT_TILEINFOTOHW_OUTPUT* pOut) const;
121
virtual UINT_32 HwlComputeHtileBpp(
122
BOOL_32 isWidth8, BOOL_32 isHeight8) const;
124
virtual UINT_32 HwlComputeHtileBaseAlign(
125
BOOL_32 isTcCompatible, BOOL_32 isLinear, ADDR_TILEINFO* pTileInfo) const;
127
virtual ADDR_E_RETURNCODE HwlComputeFmaskInfo(
128
const ADDR_COMPUTE_FMASK_INFO_INPUT* pIn,
129
ADDR_COMPUTE_FMASK_INFO_OUTPUT* pOut);
131
virtual ADDR_E_RETURNCODE HwlComputeFmaskAddrFromCoord(
132
const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn,
133
ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut) const;
135
virtual ADDR_E_RETURNCODE HwlComputeFmaskCoordFromAddr(
136
const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn,
137
ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut) const;
139
virtual BOOL_32 HwlGetAlignmentInfoMacroTiled(
140
const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
141
UINT_32* pPitchAlign, UINT_32* pHeightAlign, UINT_32* pSizeAlign) const;
143
virtual UINT_32 HwlComputeQbStereoRightSwizzle(
144
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pInfo) const;
146
virtual VOID HwlComputePixelCoordFromOffset(
147
UINT_32 offset, UINT_32 bpp, UINT_32 numSamples,
148
AddrTileMode tileMode, UINT_32 tileBase, UINT_32 compBits,
149
UINT_32* pX, UINT_32* pY, UINT_32* pSlice, UINT_32* pSample,
150
AddrTileType microTileType, BOOL_32 isDepthSampleOrder) const;
152
/// Return Cmask block max
153
virtual BOOL_32 HwlGetMaxCmaskBlockMax() const
155
return 0x3FFF; // 14 bits, 0n16383
159
/// Pure virtual function to setup tile info (indices) if client requests to do so
160
virtual VOID HwlSetupTileInfo(
161
AddrTileMode tileMode, ADDR_SURFACE_FLAGS flags,
162
UINT_32 bpp, UINT_32 pitch, UINT_32 height, UINT_32 numSamples,
163
ADDR_TILEINFO* inputTileInfo, ADDR_TILEINFO* outputTileInfo,
164
AddrTileType inTileType, ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const = 0;
166
/// Pure virtual function to get pitch alignment for linear modes
167
virtual UINT_32 HwlGetPitchAlignmentLinear(UINT_32 bpp, ADDR_SURFACE_FLAGS flags) const = 0;
169
/// Pure virtual function to get size adjustment for linear modes
170
virtual UINT_64 HwlGetSizeAdjustmentLinear(
171
AddrTileMode tileMode,
172
UINT_32 bpp, UINT_32 numSamples, UINT_32 baseAlign, UINT_32 pitchAlign,
173
UINT_32 *pPitch, UINT_32 *pHeight, UINT_32 *pHeightAlign) const = 0;
175
virtual UINT_32 HwlGetPitchAlignmentMicroTiled(
176
AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples) const;
178
virtual UINT_64 HwlGetSizeAdjustmentMicroTiled(
179
UINT_32 thickness, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples,
180
UINT_32 baseAlign, UINT_32 pitchAlign,
181
UINT_32 *pPitch, UINT_32 *pHeight) const;
183
/// Pure virtual function to do extra sanity check
184
virtual BOOL_32 HwlSanityCheckMacroTiled(
185
ADDR_TILEINFO* pTileInfo) const = 0;
187
/// Pure virtual function to check current level to be the last macro tiled one
188
virtual VOID HwlCheckLastMacroTiledLvl(
189
const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
190
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const = 0;
192
/// Adjusts bank before bank is modified by rotation
193
virtual UINT_32 HwlPreAdjustBank(
194
UINT_32 tileX, UINT_32 bank, ADDR_TILEINFO* pTileInfo) const = 0;
196
virtual VOID HwlComputeSurfaceCoord2DFromBankPipe(
197
AddrTileMode tileMode, UINT_32* pX, UINT_32* pY, UINT_32 slice,
198
UINT_32 bank, UINT_32 pipe,
199
UINT_32 bankSwizzle, UINT_32 pipeSwizzle, UINT_32 tileSlices,
201
ADDR_TILEINFO* pTileInfo) const = 0;
203
virtual BOOL_32 HwlTileInfoEqual(
204
const ADDR_TILEINFO* pLeft, const ADDR_TILEINFO* pRight) const;
206
virtual AddrTileMode HwlDegradeThickTileMode(
207
AddrTileMode baseTileMode, UINT_32 numSlices, UINT_32* pBytesPerTile) const;
209
virtual INT_32 HwlPostCheckTileIndex(
210
const ADDR_TILEINFO* pInfo, AddrTileMode mode, AddrTileType type,
211
INT curIndex = TileIndexInvalid) const
213
return TileIndexInvalid;
216
virtual VOID HwlFmaskPreThunkSurfInfo(
217
const ADDR_COMPUTE_FMASK_INFO_INPUT* pFmaskIn,
218
const ADDR_COMPUTE_FMASK_INFO_OUTPUT* pFmaskOut,
219
ADDR_COMPUTE_SURFACE_INFO_INPUT* pSurfIn,
220
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pSurfOut) const
224
virtual VOID HwlFmaskPostThunkSurfInfo(
225
const ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pSurfOut,
226
ADDR_COMPUTE_FMASK_INFO_OUTPUT* pFmaskOut) const
230
virtual UINT_32 HwlStereoCheckRightOffsetPadding(ADDR_TILEINFO* pTileInfo) const;
232
virtual BOOL_32 HwlReduceBankWidthHeight(
233
UINT_32 tileSize, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples,
234
UINT_32 bankHeightAlign, UINT_32 pipes,
235
ADDR_TILEINFO* pTileInfo) const;
237
// Protected non-virtual functions
239
/// Mip level functions
240
AddrTileMode ComputeSurfaceMipLevelTileMode(
241
AddrTileMode baseTileMode, UINT_32 bpp,
242
UINT_32 pitch, UINT_32 height, UINT_32 numSlices, UINT_32 numSamples,
243
UINT_32 pitchAlign, UINT_32 heightAlign,
244
ADDR_TILEINFO* pTileInfo) const;
246
/// Swizzle functions
247
VOID ExtractBankPipeSwizzle(
248
UINT_32 base256b, ADDR_TILEINFO* pTileInfo,
249
UINT_32* pBankSwizzle, UINT_32* pPipeSwizzle) const;
251
UINT_32 GetBankPipeSwizzle(
252
UINT_32 bankSwizzle, UINT_32 pipeSwizzle,
253
UINT_64 baseAddr, ADDR_TILEINFO* pTileInfo) const;
255
UINT_32 ComputeSliceTileSwizzle(
256
AddrTileMode tileMode, UINT_32 baseSwizzle, UINT_32 slice, UINT_64 baseAddr,
257
ADDR_TILEINFO* pTileInfo) const;
259
/// Addressing functions
260
virtual ADDR_E_RETURNCODE ComputeBankEquation(
261
UINT_32 log2BytesPP, UINT_32 threshX, UINT_32 threshY,
262
ADDR_TILEINFO* pTileInfo, ADDR_EQUATION* pEquation) const
264
return ADDR_NOTSUPPORTED;
267
UINT_32 ComputeBankFromCoord(
268
UINT_32 x, UINT_32 y, UINT_32 slice,
269
AddrTileMode tileMode, UINT_32 bankSwizzle, UINT_32 tileSpitSlice,
270
ADDR_TILEINFO* pTileInfo) const;
272
UINT_32 ComputeBankFromAddr(
273
UINT_64 addr, UINT_32 numBanks, UINT_32 numPipes) const;
275
UINT_32 ComputePipeRotation(
276
AddrTileMode tileMode, UINT_32 numPipes) const;
278
UINT_32 ComputeBankRotation(
279
AddrTileMode tileMode, UINT_32 numBanks,
280
UINT_32 numPipes) const;
282
VOID ComputeSurfaceCoord2DFromBankPipe(
283
AddrTileMode tileMode, UINT_32 x, UINT_32 y, UINT_32 slice,
284
UINT_32 bank, UINT_32 pipe,
285
UINT_32 bankSwizzle, UINT_32 pipeSwizzle, UINT_32 tileSlices,
286
ADDR_TILEINFO* pTileInfo,
287
CoordFromBankPipe *pOutput) const;
289
/// Htile/Cmask functions
290
UINT_64 ComputeHtileBytes(
291
UINT_32 pitch, UINT_32 height, UINT_32 bpp,
292
BOOL_32 isLinear, UINT_32 numSlices, UINT_64* sliceBytes, UINT_32 baseAlign) const;
294
ADDR_E_RETURNCODE ComputeMacroTileEquation(
295
UINT_32 log2BytesPP, AddrTileMode tileMode, AddrTileType microTileType,
296
ADDR_TILEINFO* pTileInfo, ADDR_EQUATION* pEquation) const;
299
static BOOL_32 IsTileInfoAllZero(const ADDR_TILEINFO* pTileInfo);
300
static UINT_32 ComputeFmaskNumPlanesFromNumSamples(UINT_32 numSamples);
301
static UINT_32 ComputeFmaskResolvedBppFromNumSamples(UINT_32 numSamples);
303
virtual VOID HwlComputeSurfaceAlignmentsMacroTiled(
304
AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags,
305
UINT_32 mipLevel, UINT_32 numSamples, ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const
311
BOOL_32 ComputeSurfaceInfoLinear(
312
const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
313
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut,
314
UINT_32 padDims) const;
316
BOOL_32 ComputeSurfaceInfoMicroTiled(
317
const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
318
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut,
320
AddrTileMode expTileMode) const;
322
BOOL_32 ComputeSurfaceInfoMacroTiled(
323
const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
324
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut,
326
AddrTileMode expTileMode) const;
328
BOOL_32 ComputeSurfaceAlignmentsLinear(
329
AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags,
330
UINT_32* pBaseAlign, UINT_32* pPitchAlign, UINT_32* pHeightAlign) const;
332
BOOL_32 ComputeSurfaceAlignmentsMicroTiled(
333
AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags,
334
UINT_32 mipLevel, UINT_32 numSamples,
335
UINT_32* pBaseAlign, UINT_32* pPitchAlign, UINT_32* pHeightAlign) const;
337
BOOL_32 ComputeSurfaceAlignmentsMacroTiled(
338
AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags,
339
UINT_32 mipLevel, UINT_32 numSamples,
340
ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const;
342
/// Surface addressing functions
343
UINT_64 DispatchComputeSurfaceAddrFromCoord(
344
const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,
345
ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut) const;
347
VOID DispatchComputeSurfaceCoordFromAddr(
348
const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,
349
ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut) const;
351
UINT_64 ComputeSurfaceAddrFromCoordMicroTiled(
352
UINT_32 x, UINT_32 y, UINT_32 slice, UINT_32 sample,
353
UINT_32 bpp, UINT_32 pitch, UINT_32 height, UINT_32 numSamples,
354
AddrTileMode tileMode,
355
AddrTileType microTileType, BOOL_32 isDepthSampleOrder,
356
UINT_32* pBitPosition) const;
358
UINT_64 ComputeSurfaceAddrFromCoordMacroTiled(
359
UINT_32 x, UINT_32 y, UINT_32 slice, UINT_32 sample,
360
UINT_32 bpp, UINT_32 pitch, UINT_32 height, UINT_32 numSamples,
361
AddrTileMode tileMode,
362
AddrTileType microTileType, BOOL_32 ignoreSE, BOOL_32 isDepthSampleOrder,
363
UINT_32 pipeSwizzle, UINT_32 bankSwizzle,
364
ADDR_TILEINFO* pTileInfo,
365
UINT_32* pBitPosition) const;
367
VOID ComputeSurfaceCoordFromAddrMacroTiled(
368
UINT_64 addr, UINT_32 bitPosition,
369
UINT_32 bpp, UINT_32 pitch, UINT_32 height, UINT_32 numSamples,
370
AddrTileMode tileMode, UINT_32 tileBase, UINT_32 compBits,
371
AddrTileType microTileType, BOOL_32 ignoreSE, BOOL_32 isDepthSampleOrder,
372
UINT_32 pipeSwizzle, UINT_32 bankSwizzle,
373
ADDR_TILEINFO* pTileInfo,
374
UINT_32* pX, UINT_32* pY, UINT_32* pSlice, UINT_32* pSample) const;
377
UINT_64 DispatchComputeFmaskAddrFromCoord(
378
const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn,
379
ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut) const;
381
VOID DispatchComputeFmaskCoordFromAddr(
382
const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn,
383
ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut) const;
385
// FMASK related methods - private
386
UINT_64 ComputeFmaskAddrFromCoordMicroTiled(
387
UINT_32 x, UINT_32 y, UINT_32 slice, UINT_32 sample, UINT_32 plane,
388
UINT_32 pitch, UINT_32 height, UINT_32 numSamples, AddrTileMode tileMode,
389
BOOL_32 resolved, UINT_32* pBitPosition) const;
391
VOID ComputeFmaskCoordFromAddrMicroTiled(
392
UINT_64 addr, UINT_32 bitPosition,
393
UINT_32 pitch, UINT_32 height, UINT_32 numSamples,
394
AddrTileMode tileMode, BOOL_32 resolved,
395
UINT_32* pX, UINT_32* pY, UINT_32* pSlice, UINT_32* pSample, UINT_32* pPlane) const;
397
VOID ComputeFmaskCoordFromAddrMacroTiled(
398
UINT_64 addr, UINT_32 bitPosition,
399
UINT_32 pitch, UINT_32 height, UINT_32 numSamples, AddrTileMode tileMode,
400
UINT_32 pipeSwizzle, UINT_32 bankSwizzle,
402
ADDR_TILEINFO* pTileInfo,
404
UINT_32* pX, UINT_32* pY, UINT_32* pSlice, UINT_32* pSample, UINT_32* pPlane) const;
406
UINT_64 ComputeFmaskAddrFromCoordMacroTiled(
407
UINT_32 x, UINT_32 y, UINT_32 slice, UINT_32 sample, UINT_32 plane,
408
UINT_32 pitch, UINT_32 height, UINT_32 numSamples,
409
AddrTileMode tileMode, UINT_32 pipeSwizzle, UINT_32 bankSwizzle,
411
ADDR_TILEINFO* pTileInfo,
413
UINT_32* pBitPosition) const;
415
/// Sanity check functions
416
BOOL_32 SanityCheckMacroTiled(
417
ADDR_TILEINFO* pTileInfo) const;
420
UINT_32 m_ranks; ///< Number of ranks - MC_ARB_RAMCFG.NOOFRANK
421
UINT_32 m_logicalBanks; ///< Logical banks = m_banks * m_ranks if m_banks != 16
422
UINT_32 m_bankInterleave; ///< Bank interleave, as a multiple of pipe interleave size