2 * Copyright © 2014 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 EgBasedAddrLib class definition.
31 ***************************************************************************************************
34 #ifndef __EG_BASED_ADDR_LIB_H__
35 #define __EG_BASED_ADDR_LIB_H__
40 /// Structures for functions
41 struct CoordFromBankPipe
56 ***************************************************************************************************
57 * @brief This class is the Evergreen based address library
58 * @note Abstract class
59 ***************************************************************************************************
61 class EgBasedAddrLib
: public AddrLib
64 EgBasedAddrLib(const AddrClient
* pClient
);
65 virtual ~EgBasedAddrLib();
69 /// Surface info functions
71 // NOTE: DispatchComputeSurfaceInfo using TileInfo takes both an input and an output.
73 // One or more fields may be 0 to be calculated/defaulted - pre-SI h/w.
74 // H/W using tile mode index only accepts none or all 0's - SI and newer h/w.
75 // It then returns the actual tiling configuration used.
76 // Other methods' TileInfo must be valid on entry
77 BOOL_32
DispatchComputeSurfaceInfo(
78 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
79 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const;
81 ADDR_E_RETURNCODE
DispatchComputeFmaskInfo(
82 const ADDR_COMPUTE_FMASK_INFO_INPUT
* pIn
,
83 ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pOut
);
87 virtual ADDR_E_RETURNCODE
HwlComputeSurfaceInfo(
88 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
89 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const;
91 virtual ADDR_E_RETURNCODE
HwlComputeSurfaceAddrFromCoord(
92 const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
* pIn
,
93 ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
* pOut
) const;
95 virtual ADDR_E_RETURNCODE
HwlComputeSurfaceCoordFromAddr(
96 const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
* pIn
,
97 ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
* pOut
) const;
99 virtual ADDR_E_RETURNCODE
HwlComputeSliceTileSwizzle(
100 const ADDR_COMPUTE_SLICESWIZZLE_INPUT
* pIn
,
101 ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
* pOut
) const;
103 virtual ADDR_E_RETURNCODE
HwlExtractBankPipeSwizzle(
104 const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
* pIn
,
105 ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
* pOut
) const;
107 virtual ADDR_E_RETURNCODE
HwlCombineBankPipeSwizzle(
108 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
, ADDR_TILEINFO
* pTileInfo
,
109 UINT_64 baseAddr
, UINT_32
* pTileSwizzle
) const;
111 virtual ADDR_E_RETURNCODE
HwlComputeBaseSwizzle(
112 const ADDR_COMPUTE_BASE_SWIZZLE_INPUT
* pIn
,
113 ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
* pOut
) const;
115 virtual ADDR_E_RETURNCODE
HwlConvertTileInfoToHW(
116 const ADDR_CONVERT_TILEINFOTOHW_INPUT
* pIn
,
117 ADDR_CONVERT_TILEINFOTOHW_OUTPUT
* pOut
) const;
119 virtual UINT_32
HwlComputeHtileBpp(
120 BOOL_32 isWidth8
, BOOL_32 isHeight8
) const;
122 virtual UINT_32
HwlComputeHtileBaseAlign(
123 BOOL_32 isTcCompatible
, BOOL_32 isLinear
, ADDR_TILEINFO
* pTileInfo
) const;
125 virtual ADDR_E_RETURNCODE
HwlComputeFmaskInfo(
126 const ADDR_COMPUTE_FMASK_INFO_INPUT
* pIn
,
127 ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pOut
);
129 virtual ADDR_E_RETURNCODE
HwlComputeFmaskAddrFromCoord(
130 const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
* pIn
,
131 ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
* pOut
) const;
133 virtual ADDR_E_RETURNCODE
HwlComputeFmaskCoordFromAddr(
134 const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
* pIn
,
135 ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
* pOut
) const;
137 virtual BOOL_32
HwlDegradeBaseLevel(
138 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
) const;
140 virtual UINT_32
HwlComputeQbStereoRightSwizzle(
141 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pInfo
) const;
143 virtual VOID
HwlComputePixelCoordFromOffset(
144 UINT_32 offset
, UINT_32 bpp
, UINT_32 numSamples
,
145 AddrTileMode tileMode
, UINT_32 tileBase
, UINT_32 compBits
,
146 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
,
147 AddrTileType microTileType
, BOOL_32 isDepthSampleOrder
) const;
149 /// Return Cmask block max
150 virtual BOOL_32
HwlGetMaxCmaskBlockMax() const
152 return 16383; // 14 bits
156 /// Pure virtual function to setup tile info (indices) if client requests to do so
157 virtual VOID
HwlSetupTileInfo(
158 AddrTileMode tileMode
, ADDR_SURFACE_FLAGS flags
,
159 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
160 ADDR_TILEINFO
* inputTileInfo
, ADDR_TILEINFO
* outputTileInfo
,
161 AddrTileType inTileType
, ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const = 0;
163 /// Pure virtual function to get pitch alignment for linear modes
164 virtual UINT_32
HwlGetPitchAlignmentLinear(UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
) const = 0;
166 /// Pure virtual function to get size adjustment for linear modes
167 virtual UINT_64
HwlGetSizeAdjustmentLinear(
168 AddrTileMode tileMode
,
169 UINT_32 bpp
, UINT_32 numSamples
, UINT_32 baseAlign
, UINT_32 pitchAlign
,
170 UINT_32
*pPitch
, UINT_32
*pHeight
, UINT_32
*pHeightAlign
) const = 0;
172 virtual UINT_32
HwlGetPitchAlignmentMicroTiled(
173 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
, UINT_32 numSamples
) const;
175 virtual UINT_64
HwlGetSizeAdjustmentMicroTiled(
176 UINT_32 thickness
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
, UINT_32 numSamples
,
177 UINT_32 baseAlign
, UINT_32 pitchAlign
,
178 UINT_32
*pPitch
, UINT_32
*pHeight
) const;
180 /// Pure virtual function to do extra sanity check
181 virtual BOOL_32
HwlSanityCheckMacroTiled(
182 ADDR_TILEINFO
* pTileInfo
) const = 0;
184 /// Pure virtual function to check current level to be the last macro tiled one
185 virtual VOID
HwlCheckLastMacroTiledLvl(
186 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
187 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const = 0;
189 /// Adjusts bank before bank is modified by rotation
190 virtual UINT_32
HwlPreAdjustBank(
191 UINT_32 tileX
, UINT_32 bank
, ADDR_TILEINFO
* pTileInfo
) const = 0;
193 virtual VOID
HwlComputeSurfaceCoord2DFromBankPipe(
194 AddrTileMode tileMode
, UINT_32
* pX
, UINT_32
* pY
, UINT_32 slice
,
195 UINT_32 bank
, UINT_32 pipe
,
196 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
, UINT_32 tileSlices
,
198 ADDR_TILEINFO
* pTileInfo
) const = 0;
200 virtual BOOL_32
HwlTileInfoEqual(
201 const ADDR_TILEINFO
* pLeft
, const ADDR_TILEINFO
* pRight
) const;
203 virtual AddrTileMode
HwlDegradeThickTileMode(
204 AddrTileMode baseTileMode
, UINT_32 numSlices
, UINT_32
* pBytesPerTile
) const;
206 virtual INT_32
HwlPostCheckTileIndex(
207 const ADDR_TILEINFO
* pInfo
, AddrTileMode mode
, AddrTileType type
,
208 INT curIndex
= TileIndexInvalid
) const
210 return TileIndexInvalid
;
213 virtual VOID
HwlFmaskPreThunkSurfInfo(
214 const ADDR_COMPUTE_FMASK_INFO_INPUT
* pFmaskIn
,
215 const ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pFmaskOut
,
216 ADDR_COMPUTE_SURFACE_INFO_INPUT
* pSurfIn
,
217 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pSurfOut
) const
221 virtual VOID
HwlFmaskPostThunkSurfInfo(
222 const ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pSurfOut
,
223 ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pFmaskOut
) const
227 /// Virtual function to check if the height needs extra padding
228 /// for stereo right eye offset, to avoid bank pipe swizzle
229 virtual BOOL_32
HwlStereoCheckRightOffsetPadding() const
234 virtual BOOL_32
HwlReduceBankWidthHeight(
235 UINT_32 tileSize
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
, UINT_32 numSamples
,
236 UINT_32 bankHeightAlign
, UINT_32 pipes
,
237 ADDR_TILEINFO
* pTileInfo
) const;
239 // Protected non-virtual functions
241 /// Mip level functions
242 AddrTileMode
ComputeSurfaceMipLevelTileMode(
243 AddrTileMode baseTileMode
, UINT_32 bpp
,
244 UINT_32 pitch
, UINT_32 height
, UINT_32 numSlices
, UINT_32 numSamples
,
245 UINT_32 pitchAlign
, UINT_32 heightAlign
,
246 ADDR_TILEINFO
* pTileInfo
) const;
248 /// Swizzle functions
249 VOID
ExtractBankPipeSwizzle(
250 UINT_32 base256b
, ADDR_TILEINFO
* pTileInfo
,
251 UINT_32
* pBankSwizzle
, UINT_32
* pPipeSwizzle
) const;
253 UINT_32
GetBankPipeSwizzle(
254 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
,
255 UINT_64 baseAddr
, ADDR_TILEINFO
* pTileInfo
) const;
257 UINT_32
ComputeSliceTileSwizzle(
258 AddrTileMode tileMode
, UINT_32 baseSwizzle
, UINT_32 slice
, UINT_64 baseAddr
,
259 ADDR_TILEINFO
* pTileInfo
) const;
261 /// Addressing functions
262 UINT_32
ComputeBankFromCoord(
263 UINT_32 x
, UINT_32 y
, UINT_32 slice
,
264 AddrTileMode tileMode
, UINT_32 bankSwizzle
, UINT_32 tileSpitSlice
,
265 ADDR_TILEINFO
* pTileInfo
) const;
267 UINT_32
ComputeBankFromAddr(
268 UINT_64 addr
, UINT_32 numBanks
, UINT_32 numPipes
) const;
270 UINT_32
ComputePipeRotation(
271 AddrTileMode tileMode
, UINT_32 numPipes
) const;
273 UINT_32
ComputeBankRotation(
274 AddrTileMode tileMode
, UINT_32 numBanks
,
275 UINT_32 numPipes
) const;
277 VOID
ComputeSurfaceCoord2DFromBankPipe(
278 AddrTileMode tileMode
, UINT_32 x
, UINT_32 y
, UINT_32 slice
,
279 UINT_32 bank
, UINT_32 pipe
,
280 UINT_32 bankSwizzle
, UINT_32 pipeSwizzle
, UINT_32 tileSlices
,
281 ADDR_TILEINFO
* pTileInfo
,
282 CoordFromBankPipe
*pOutput
) const;
284 /// Htile/Cmask functions
285 UINT_64
ComputeHtileBytes(
286 UINT_32 pitch
, UINT_32 height
, UINT_32 bpp
,
287 BOOL_32 isLinear
, UINT_32 numSlices
, UINT_64
* sliceBytes
, UINT_32 baseAlign
) const;
290 static BOOL_32
IsTileInfoAllZero(ADDR_TILEINFO
* pTileInfo
);
291 static UINT_32
ComputeFmaskNumPlanesFromNumSamples(UINT_32 numSamples
);
292 static UINT_32
ComputeFmaskResolvedBppFromNumSamples(UINT_32 numSamples
);
296 BOOL_32
ComputeSurfaceInfoLinear(
297 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
298 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
,
299 UINT_32 padDims
) const;
301 BOOL_32
ComputeSurfaceInfoMicroTiled(
302 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
303 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
,
305 AddrTileMode expTileMode
) const;
307 BOOL_32
ComputeSurfaceInfoMacroTiled(
308 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
,
309 ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
,
311 AddrTileMode expTileMode
) const;
313 BOOL_32
ComputeSurfaceAlignmentsLinear(
314 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
315 UINT_32
* pBaseAlign
, UINT_32
* pPitchAlign
, UINT_32
* pHeightAlign
) const;
317 BOOL_32
ComputeSurfaceAlignmentsMicroTiled(
318 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
319 UINT_32 mipLevel
, UINT_32 numSamples
,
320 UINT_32
* pBaseAlign
, UINT_32
* pPitchAlign
, UINT_32
* pHeightAlign
) const;
322 BOOL_32
ComputeSurfaceAlignmentsMacroTiled(
323 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
324 UINT_32 mipLevel
, UINT_32 numSamples
,
325 ADDR_TILEINFO
* pTileInfo
,
326 UINT_32
* pBaseAlign
, UINT_32
* pPitchAlign
, UINT_32
* pHeightAlign
) const;
328 /// Surface addressing functions
329 UINT_64
DispatchComputeSurfaceAddrFromCoord(
330 const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
* pIn
,
331 ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
* pOut
) const;
333 VOID
DispatchComputeSurfaceCoordFromAddr(
334 const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
* pIn
,
335 ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
* pOut
) const;
337 UINT_64
ComputeSurfaceAddrFromCoordMicroTiled(
338 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
,
339 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
340 AddrTileMode tileMode
,
341 AddrTileType microTileType
, BOOL_32 isDepthSampleOrder
,
342 UINT_32
* pBitPosition
) const;
344 UINT_64
ComputeSurfaceAddrFromCoordMacroTiled(
345 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
,
346 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
347 AddrTileMode tileMode
,
348 AddrTileType microTileType
, BOOL_32 ignoreSE
, BOOL_32 isDepthSampleOrder
,
349 UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
350 ADDR_TILEINFO
* pTileInfo
,
351 UINT_32
* pBitPosition
) const;
353 VOID
ComputeSurfaceCoordFromAddrMacroTiled(
354 UINT_64 addr
, UINT_32 bitPosition
,
355 UINT_32 bpp
, UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
356 AddrTileMode tileMode
, UINT_32 tileBase
, UINT_32 compBits
,
357 AddrTileType microTileType
, BOOL_32 ignoreSE
, BOOL_32 isDepthSampleOrder
,
358 UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
359 ADDR_TILEINFO
* pTileInfo
,
360 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
) const;
363 UINT_64
DispatchComputeFmaskAddrFromCoord(
364 const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
* pIn
,
365 ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
* pOut
) const;
367 VOID
DispatchComputeFmaskCoordFromAddr(
368 const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
* pIn
,
369 ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
* pOut
) const;
371 // FMASK related methods - private
372 UINT_64
ComputeFmaskAddrFromCoordMicroTiled(
373 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
, UINT_32 plane
,
374 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
, AddrTileMode tileMode
,
375 BOOL_32 resolved
, UINT_32
* pBitPosition
) const;
377 VOID
ComputeFmaskCoordFromAddrMicroTiled(
378 UINT_64 addr
, UINT_32 bitPosition
,
379 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
380 AddrTileMode tileMode
, BOOL_32 resolved
,
381 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
, UINT_32
* pPlane
) const;
383 VOID
ComputeFmaskCoordFromAddrMacroTiled(
384 UINT_64 addr
, UINT_32 bitPosition
,
385 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
, AddrTileMode tileMode
,
386 UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
388 ADDR_TILEINFO
* pTileInfo
,
390 UINT_32
* pX
, UINT_32
* pY
, UINT_32
* pSlice
, UINT_32
* pSample
, UINT_32
* pPlane
) const;
392 UINT_64
ComputeFmaskAddrFromCoordMacroTiled(
393 UINT_32 x
, UINT_32 y
, UINT_32 slice
, UINT_32 sample
, UINT_32 plane
,
394 UINT_32 pitch
, UINT_32 height
, UINT_32 numSamples
,
395 AddrTileMode tileMode
, UINT_32 pipeSwizzle
, UINT_32 bankSwizzle
,
397 ADDR_TILEINFO
* pTileInfo
,
399 UINT_32
* pBitPosition
) const;
401 /// Sanity check functions
402 BOOL_32
SanityCheckMacroTiled(
403 ADDR_TILEINFO
* pTileInfo
) const;
406 UINT_32 m_ranks
; ///< Number of ranks - MC_ARB_RAMCFG.NOOFRANK
407 UINT_32 m_logicalBanks
; ///< Logical banks = m_banks * m_ranks if m_banks != 16
408 UINT_32 m_bankInterleave
; ///< Bank interleave, as a multiple of pipe interleave size