2 * Copyright © 2007-2018 Advanced Micro Devices, Inc.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
15 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16 * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
17 * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
28 ****************************************************************************************************
30 * @brief Contains the EgBasedLib class definition.
31 ****************************************************************************************************
34 #ifndef __EG_BASED_ADDR_LIB_H__
35 #define __EG_BASED_ADDR_LIB_H__
43 /// Structures for functions
44 struct CoordFromBankPipe
59 ****************************************************************************************************
60 * @brief This class is the Evergreen based address library
61 * @note Abstract class
62 ****************************************************************************************************
64 class EgBasedLib
: public Lib
67 EgBasedLib(const Client
* pClient
);
68 virtual ~EgBasedLib();
72 /// Surface info functions
74 // NOTE: DispatchComputeSurfaceInfo using TileInfo takes both an input and an output.
76 // One or more fields may be 0 to be calculated/defaulted - pre-SI h/w.
77 // H/W using tile mode index only accepts none or all 0's - SI and newer h/w.
78 // It then returns the actual tiling configuration used.
79 // Other methods' TileInfo must be valid on entry
80 BOOL_32
DispatchComputeSurfaceInfo(
81 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
82 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const;
84 ADDR_E_RETURNCODE
DispatchComputeFmaskInfo(
85 const ADDR_COMPUTE_FMASK_INFO_INPUT
* pIn
,
86 ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pOut
);
90 virtual ADDR_E_RETURNCODE
HwlComputeSurfaceInfo(
91 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
92 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const;
94 virtual ADDR_E_RETURNCODE
HwlComputeSurfaceAddrFromCoord(
95 const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
* pIn
,
96 ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
* pOut
) const;
98 virtual ADDR_E_RETURNCODE
HwlComputeSurfaceCoordFromAddr(
99 const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
* pIn
,
100 ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
* pOut
) const;
102 virtual ADDR_E_RETURNCODE
HwlComputeSliceTileSwizzle(
103 const ADDR_COMPUTE_SLICESWIZZLE_INPUT
* pIn
,
104 ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
* pOut
) const;
106 virtual ADDR_E_RETURNCODE
HwlExtractBankPipeSwizzle(
107 const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
* pIn
,
108 ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
* pOut
) const;
110 virtual ADDR_E_RETURNCODE
HwlCombineBankPipeSwizzle(
111 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
, ADDR_TILEINFO
* pTileInfo
,
112 UINT_64 baseAddr
, UINT_32
* pTileSwizzle
) const;
114 virtual ADDR_E_RETURNCODE
HwlComputeBaseSwizzle(
115 const ADDR_COMPUTE_BASE_SWIZZLE_INPUT
* pIn
,
116 ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
* pOut
) const;
118 virtual ADDR_E_RETURNCODE
HwlConvertTileInfoToHW(
119 const ADDR_CONVERT_TILEINFOTOHW_INPUT
* pIn
,
120 ADDR_CONVERT_TILEINFOTOHW_OUTPUT
* pOut
) const;
122 virtual UINT_32
HwlComputeHtileBpp(
123 BOOL_32 isWidth8
, BOOL_32 isHeight8
) const;
125 virtual UINT_32
HwlComputeHtileBaseAlign(
126 BOOL_32 isTcCompatible
, BOOL_32 isLinear
, ADDR_TILEINFO
* pTileInfo
) const;
128 virtual ADDR_E_RETURNCODE
HwlComputeFmaskInfo(
129 const ADDR_COMPUTE_FMASK_INFO_INPUT
* pIn
,
130 ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pOut
);
132 virtual ADDR_E_RETURNCODE
HwlComputeFmaskAddrFromCoord(
133 const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
* pIn
,
134 ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
* pOut
) const;
136 virtual ADDR_E_RETURNCODE
HwlComputeFmaskCoordFromAddr(
137 const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
* pIn
,
138 ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
* pOut
) const;
140 virtual BOOL_32
HwlGetAlignmentInfoMacroTiled(
141 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
142 UINT_32
* pPitchAlign
, UINT_32
* pHeightAlign
, UINT_32
* pSizeAlign
) const;
144 virtual UINT_32
HwlComputeQbStereoRightSwizzle(
145 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pInfo
) const;
147 virtual VOID
HwlComputePixelCoordFromOffset(
148 UINT_32 offset
, UINT_32 bpp
, UINT_32 numSamples
,
149 AddrTileMode tileMode
, UINT_32 tileBase
, UINT_32 compBits
,
150 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
,
151 AddrTileType microTileType
, BOOL_32 isDepthSampleOrder
) const;
153 /// Return Cmask block max
154 virtual BOOL_32
HwlGetMaxCmaskBlockMax() const
156 return 0x3FFF; // 14 bits, 0n16383
160 /// Pure virtual function to setup tile info (indices) if client requests to do so
161 virtual VOID
HwlSetupTileInfo(
162 AddrTileMode tileMode
, ADDR_SURFACE_FLAGS flags
,
163 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
164 ADDR_TILEINFO
* inputTileInfo
, ADDR_TILEINFO
* outputTileInfo
,
165 AddrTileType inTileType
, ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const = 0;
167 /// Pure virtual function to get pitch alignment for linear modes
168 virtual UINT_32
HwlGetPitchAlignmentLinear(UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
) const = 0;
170 /// Pure virtual function to get size adjustment for linear modes
171 virtual UINT_64
HwlGetSizeAdjustmentLinear(
172 AddrTileMode tileMode
,
173 UINT_32 bpp
, UINT_32 numSamples
, UINT_32 baseAlign
, UINT_32 pitchAlign
,
174 UINT_32
*pPitch
, UINT_32
*pHeight
, UINT_32
*pHeightAlign
) const = 0;
176 virtual UINT_32
HwlGetPitchAlignmentMicroTiled(
177 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
, UINT_32 numSamples
) const;
179 virtual UINT_64
HwlGetSizeAdjustmentMicroTiled(
180 UINT_32 thickness
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
, UINT_32 numSamples
,
181 UINT_32 baseAlign
, UINT_32 pitchAlign
,
182 UINT_32
*pPitch
, UINT_32
*pHeight
) const;
184 /// Pure virtual function to do extra sanity check
185 virtual BOOL_32
HwlSanityCheckMacroTiled(
186 ADDR_TILEINFO
* pTileInfo
) const = 0;
188 /// Pure virtual function to check current level to be the last macro tiled one
189 virtual VOID
HwlCheckLastMacroTiledLvl(
190 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
191 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const = 0;
193 /// Adjusts bank before bank is modified by rotation
194 virtual UINT_32
HwlPreAdjustBank(
195 UINT_32 tileX
, UINT_32 bank
, ADDR_TILEINFO
* pTileInfo
) const = 0;
197 virtual VOID
HwlComputeSurfaceCoord2DFromBankPipe(
198 AddrTileMode tileMode
, UINT_32
* pX
, UINT_32
* pY
, UINT_32 slice
,
199 UINT_32 bank
, UINT_32 pipe
,
200 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
, UINT_32 tileSlices
,
202 ADDR_TILEINFO
* pTileInfo
) const = 0;
204 virtual BOOL_32
HwlTileInfoEqual(
205 const ADDR_TILEINFO
* pLeft
, const ADDR_TILEINFO
* pRight
) const;
207 virtual AddrTileMode
HwlDegradeThickTileMode(
208 AddrTileMode baseTileMode
, UINT_32 numSlices
, UINT_32
* pBytesPerTile
) const;
210 virtual INT_32
HwlPostCheckTileIndex(
211 const ADDR_TILEINFO
* pInfo
, AddrTileMode mode
, AddrTileType type
,
212 INT curIndex
= TileIndexInvalid
) const
214 return TileIndexInvalid
;
217 virtual VOID
HwlFmaskPreThunkSurfInfo(
218 const ADDR_COMPUTE_FMASK_INFO_INPUT
* pFmaskIn
,
219 const ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pFmaskOut
,
220 ADDR_COMPUTE_SURFACE_INFO_INPUT
* pSurfIn
,
221 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pSurfOut
) const
225 virtual VOID
HwlFmaskPostThunkSurfInfo(
226 const ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pSurfOut
,
227 ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pFmaskOut
) const
231 virtual UINT_32
HwlStereoCheckRightOffsetPadding(ADDR_TILEINFO
* pTileInfo
) const;
233 virtual BOOL_32
HwlReduceBankWidthHeight(
234 UINT_32 tileSize
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
, UINT_32 numSamples
,
235 UINT_32 bankHeightAlign
, UINT_32 pipes
,
236 ADDR_TILEINFO
* pTileInfo
) const;
238 // Protected non-virtual functions
240 /// Mip level functions
241 AddrTileMode
ComputeSurfaceMipLevelTileMode(
242 AddrTileMode baseTileMode
, UINT_32 bpp
,
243 UINT_32 pitch
, UINT_32 height
, UINT_32 numSlices
, UINT_32 numSamples
,
244 UINT_32 pitchAlign
, UINT_32 heightAlign
,
245 ADDR_TILEINFO
* pTileInfo
) const;
247 /// Swizzle functions
248 VOID
ExtractBankPipeSwizzle(
249 UINT_32 base256b
, ADDR_TILEINFO
* pTileInfo
,
250 UINT_32
* pBankSwizzle
, UINT_32
* pPipeSwizzle
) const;
252 UINT_32
GetBankPipeSwizzle(
253 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
,
254 UINT_64 baseAddr
, ADDR_TILEINFO
* pTileInfo
) const;
256 UINT_32
ComputeSliceTileSwizzle(
257 AddrTileMode tileMode
, UINT_32 baseSwizzle
, UINT_32 slice
, UINT_64 baseAddr
,
258 ADDR_TILEINFO
* pTileInfo
) const;
260 /// Addressing functions
261 virtual ADDR_E_RETURNCODE
ComputeBankEquation(
262 UINT_32 log2BytesPP
, UINT_32 threshX
, UINT_32 threshY
,
263 ADDR_TILEINFO
* pTileInfo
, ADDR_EQUATION
* pEquation
) const
265 return ADDR_NOTSUPPORTED
;
268 UINT_32
ComputeBankFromCoord(
269 UINT_32 x
, UINT_32 y
, UINT_32 slice
,
270 AddrTileMode tileMode
, UINT_32 bankSwizzle
, UINT_32 tileSpitSlice
,
271 ADDR_TILEINFO
* pTileInfo
) const;
273 UINT_32
ComputeBankFromAddr(
274 UINT_64 addr
, UINT_32 numBanks
, UINT_32 numPipes
) const;
276 UINT_32
ComputePipeRotation(
277 AddrTileMode tileMode
, UINT_32 numPipes
) const;
279 UINT_32
ComputeBankRotation(
280 AddrTileMode tileMode
, UINT_32 numBanks
,
281 UINT_32 numPipes
) const;
283 VOID
ComputeSurfaceCoord2DFromBankPipe(
284 AddrTileMode tileMode
, UINT_32 x
, UINT_32 y
, UINT_32 slice
,
285 UINT_32 bank
, UINT_32 pipe
,
286 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
, UINT_32 tileSlices
,
287 ADDR_TILEINFO
* pTileInfo
,
288 CoordFromBankPipe
*pOutput
) const;
290 /// Htile/Cmask functions
291 UINT_64
ComputeHtileBytes(
292 UINT_32 pitch
, UINT_32 height
, UINT_32 bpp
,
293 BOOL_32 isLinear
, UINT_32 numSlices
, UINT_64
* sliceBytes
, UINT_32 baseAlign
) const;
295 ADDR_E_RETURNCODE
ComputeMacroTileEquation(
296 UINT_32 log2BytesPP
, AddrTileMode tileMode
, AddrTileType microTileType
,
297 ADDR_TILEINFO
* pTileInfo
, ADDR_EQUATION
* pEquation
) const;
300 static BOOL_32
IsTileInfoAllZero(const ADDR_TILEINFO
* pTileInfo
);
301 static UINT_32
ComputeFmaskNumPlanesFromNumSamples(UINT_32 numSamples
);
302 static UINT_32
ComputeFmaskResolvedBppFromNumSamples(UINT_32 numSamples
);
304 virtual VOID
HwlComputeSurfaceAlignmentsMacroTiled(
305 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
306 UINT_32 mipLevel
, UINT_32 numSamples
, ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const
312 BOOL_32
ComputeSurfaceInfoLinear(
313 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
314 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
,
315 UINT_32 padDims
) const;
317 BOOL_32
ComputeSurfaceInfoMicroTiled(
318 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
319 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
,
321 AddrTileMode expTileMode
) const;
323 BOOL_32
ComputeSurfaceInfoMacroTiled(
324 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
325 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
,
327 AddrTileMode expTileMode
) const;
329 BOOL_32
ComputeSurfaceAlignmentsLinear(
330 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
331 UINT_32
* pBaseAlign
, UINT_32
* pPitchAlign
, UINT_32
* pHeightAlign
) const;
333 BOOL_32
ComputeSurfaceAlignmentsMicroTiled(
334 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
335 UINT_32 mipLevel
, UINT_32 numSamples
,
336 UINT_32
* pBaseAlign
, UINT_32
* pPitchAlign
, UINT_32
* pHeightAlign
) const;
338 BOOL_32
ComputeSurfaceAlignmentsMacroTiled(
339 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
340 UINT_32 mipLevel
, UINT_32 numSamples
,
341 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const;
343 /// Surface addressing functions
344 UINT_64
DispatchComputeSurfaceAddrFromCoord(
345 const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
* pIn
,
346 ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
* pOut
) const;
348 VOID
DispatchComputeSurfaceCoordFromAddr(
349 const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
* pIn
,
350 ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
* pOut
) const;
352 UINT_64
ComputeSurfaceAddrFromCoordMicroTiled(
353 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
,
354 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
355 AddrTileMode tileMode
,
356 AddrTileType microTileType
, BOOL_32 isDepthSampleOrder
,
357 UINT_32
* pBitPosition
) const;
359 UINT_64
ComputeSurfaceAddrFromCoordMacroTiled(
360 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
,
361 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
362 AddrTileMode tileMode
,
363 AddrTileType microTileType
, BOOL_32 ignoreSE
, BOOL_32 isDepthSampleOrder
,
364 UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
365 ADDR_TILEINFO
* pTileInfo
,
366 UINT_32
* pBitPosition
) const;
368 VOID
ComputeSurfaceCoordFromAddrMacroTiled(
369 UINT_64 addr
, UINT_32 bitPosition
,
370 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
371 AddrTileMode tileMode
, UINT_32 tileBase
, UINT_32 compBits
,
372 AddrTileType microTileType
, BOOL_32 ignoreSE
, BOOL_32 isDepthSampleOrder
,
373 UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
374 ADDR_TILEINFO
* pTileInfo
,
375 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
) const;
378 UINT_64
DispatchComputeFmaskAddrFromCoord(
379 const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
* pIn
,
380 ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
* pOut
) const;
382 VOID
DispatchComputeFmaskCoordFromAddr(
383 const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
* pIn
,
384 ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
* pOut
) const;
386 // FMASK related methods - private
387 UINT_64
ComputeFmaskAddrFromCoordMicroTiled(
388 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
, UINT_32 plane
,
389 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
, AddrTileMode tileMode
,
390 BOOL_32 resolved
, UINT_32
* pBitPosition
) const;
392 VOID
ComputeFmaskCoordFromAddrMicroTiled(
393 UINT_64 addr
, UINT_32 bitPosition
,
394 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
395 AddrTileMode tileMode
, BOOL_32 resolved
,
396 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
, UINT_32
* pPlane
) const;
398 VOID
ComputeFmaskCoordFromAddrMacroTiled(
399 UINT_64 addr
, UINT_32 bitPosition
,
400 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
, AddrTileMode tileMode
,
401 UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
403 ADDR_TILEINFO
* pTileInfo
,
405 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
, UINT_32
* pPlane
) const;
407 UINT_64
ComputeFmaskAddrFromCoordMacroTiled(
408 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
, UINT_32 plane
,
409 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
410 AddrTileMode tileMode
, UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
412 ADDR_TILEINFO
* pTileInfo
,
414 UINT_32
* pBitPosition
) const;
416 /// Sanity check functions
417 BOOL_32
SanityCheckMacroTiled(
418 ADDR_TILEINFO
* pTileInfo
) const;
421 UINT_32 m_ranks
; ///< Number of ranks - MC_ARB_RAMCFG.NOOFRANK
422 UINT_32 m_logicalBanks
; ///< Logical banks = m_banks * m_ranks if m_banks != 16
423 UINT_32 m_bankInterleave
; ///< Bank interleave, as a multiple of pipe interleave size