Added few more stubs so that control reaches to DestroyDevice().
[mesa.git] / src / amd / addrlib / inc / addrinterface.h
1 /*
2 * Copyright © 2007-2019 Advanced Micro Devices, Inc.
3 * All Rights Reserved.
4 *
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:
12 *
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.
21 *
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
24 * of the Software.
25 */
26
27 /**
28 ****************************************************************************************************
29 * @file addrinterface.h
30 * @brief Contains the addrlib interfaces declaration and parameter defines
31 ****************************************************************************************************
32 */
33 #ifndef __ADDR_INTERFACE_H__
34 #define __ADDR_INTERFACE_H__
35
36 #include "addrtypes.h"
37
38 #if defined(__cplusplus)
39 extern "C"
40 {
41 #endif
42
43 #define ADDRLIB_VERSION_MAJOR 6
44 #define ADDRLIB_VERSION_MINOR 2
45 #define ADDRLIB_VERSION ((ADDRLIB_VERSION_MAJOR << 16) | ADDRLIB_VERSION_MINOR)
46
47 /// Virtually all interface functions need ADDR_HANDLE as first parameter
48 typedef VOID* ADDR_HANDLE;
49
50 /// Client handle used in callbacks
51 typedef VOID* ADDR_CLIENT_HANDLE;
52
53 /**
54 * /////////////////////////////////////////////////////////////////////////////////////////////////
55 * // Callback functions
56 * /////////////////////////////////////////////////////////////////////////////////////////////////
57 * typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)(
58 * const ADDR_ALLOCSYSMEM_INPUT* pInput);
59 * typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)(
60 * VOID* pVirtAddr);
61 * typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)(
62 * const ADDR_DEBUGPRINT_INPUT* pInput);
63 *
64 * /////////////////////////////////////////////////////////////////////////////////////////////////
65 * // Create/Destroy/Config functions
66 * /////////////////////////////////////////////////////////////////////////////////////////////////
67 * AddrCreate()
68 * AddrDestroy()
69 *
70 * /////////////////////////////////////////////////////////////////////////////////////////////////
71 * // Surface functions
72 * /////////////////////////////////////////////////////////////////////////////////////////////////
73 * AddrComputeSurfaceInfo()
74 * AddrComputeSurfaceAddrFromCoord()
75 * AddrComputeSurfaceCoordFromAddr()
76 *
77 * /////////////////////////////////////////////////////////////////////////////////////////////////
78 * // HTile functions
79 * /////////////////////////////////////////////////////////////////////////////////////////////////
80 * AddrComputeHtileInfo()
81 * AddrComputeHtileAddrFromCoord()
82 * AddrComputeHtileCoordFromAddr()
83 *
84 * /////////////////////////////////////////////////////////////////////////////////////////////////
85 * // C-mask functions
86 * /////////////////////////////////////////////////////////////////////////////////////////////////
87 * AddrComputeCmaskInfo()
88 * AddrComputeCmaskAddrFromCoord()
89 * AddrComputeCmaskCoordFromAddr()
90 *
91 * /////////////////////////////////////////////////////////////////////////////////////////////////
92 * // F-mask functions
93 * /////////////////////////////////////////////////////////////////////////////////////////////////
94 * AddrComputeFmaskInfo()
95 * AddrComputeFmaskAddrFromCoord()
96 * AddrComputeFmaskCoordFromAddr()
97 *
98 * /////////////////////////////////////////////////////////////////////////////////////////////////
99 * // Element/Utility functions
100 * /////////////////////////////////////////////////////////////////////////////////////////////////
101 * ElemFlt32ToDepthPixel()
102 * ElemFlt32ToColorPixel()
103 * AddrExtractBankPipeSwizzle()
104 * AddrCombineBankPipeSwizzle()
105 * AddrComputeSliceSwizzle()
106 * AddrConvertTileInfoToHW()
107 * AddrConvertTileIndex()
108 * AddrConvertTileIndex1()
109 * AddrGetTileIndex()
110 * AddrComputeBaseSwizzle()
111 * AddrUseTileIndex()
112 * AddrUseCombinedSwizzle()
113 *
114 **/
115
116 ////////////////////////////////////////////////////////////////////////////////////////////////////
117 // Callback functions
118 ////////////////////////////////////////////////////////////////////////////////////////////////////
119
120 /**
121 ****************************************************************************************************
122 * @brief channel setting structure
123 ****************************************************************************************************
124 */
125 typedef union _ADDR_CHANNEL_SETTING
126 {
127 struct
128 {
129 UINT_8 valid : 1; ///< Indicate whehter this channel setting is valid
130 UINT_8 channel : 2; ///< 0 for x channel, 1 for y channel, 2 for z channel
131 UINT_8 index : 5; ///< Channel index
132 };
133 UINT_8 value; ///< Value
134 } ADDR_CHANNEL_SETTING;
135
136 /**
137 ****************************************************************************************************
138 * @brief address equation key structure
139 ****************************************************************************************************
140 */
141 typedef union _ADDR_EQUATION_KEY
142 {
143 struct
144 {
145 UINT_32 log2ElementBytes : 3; ///< Log2 of Bytes per pixel
146 UINT_32 tileMode : 5; ///< Tile mode
147 UINT_32 microTileType : 3; ///< Micro tile type
148 UINT_32 pipeConfig : 5; ///< pipe config
149 UINT_32 numBanksLog2 : 3; ///< Number of banks log2
150 UINT_32 bankWidth : 4; ///< Bank width
151 UINT_32 bankHeight : 4; ///< Bank height
152 UINT_32 macroAspectRatio : 3; ///< Macro tile aspect ratio
153 UINT_32 prt : 1; ///< SI only, indicate whether this equation is for prt
154 UINT_32 reserved : 1; ///< Reserved bit
155 } fields;
156 UINT_32 value;
157 } ADDR_EQUATION_KEY;
158
159 /**
160 ****************************************************************************************************
161 * @brief address equation structure
162 ****************************************************************************************************
163 */
164 #define ADDR_MAX_EQUATION_BIT 20u
165
166 // Invalid equation index
167 #define ADDR_INVALID_EQUATION_INDEX 0xFFFFFFFF
168
169 typedef struct _ADDR_EQUATION
170 {
171 ADDR_CHANNEL_SETTING addr[ADDR_MAX_EQUATION_BIT]; ///< addr setting
172 ///< each bit is result of addr ^ xor ^ xor2
173 ADDR_CHANNEL_SETTING xor1[ADDR_MAX_EQUATION_BIT]; ///< xor setting
174 ADDR_CHANNEL_SETTING xor2[ADDR_MAX_EQUATION_BIT]; ///< xor2 setting
175 UINT_32 numBits; ///< The number of bits in equation
176 BOOL_32 stackedDepthSlices; ///< TRUE if depth slices are treated as being
177 ///< stacked vertically prior to swizzling
178 } ADDR_EQUATION;
179
180 /**
181 ****************************************************************************************************
182 * @brief Alloc system memory flags.
183 * @note These flags are reserved for future use and if flags are added will minimize the impact
184 * of the client.
185 ****************************************************************************************************
186 */
187 typedef union _ADDR_ALLOCSYSMEM_FLAGS
188 {
189 struct
190 {
191 UINT_32 reserved : 32; ///< Reserved for future use.
192 } fields;
193 UINT_32 value;
194
195 } ADDR_ALLOCSYSMEM_FLAGS;
196
197 /**
198 ****************************************************************************************************
199 * @brief Alloc system memory input structure
200 ****************************************************************************************************
201 */
202 typedef struct _ADDR_ALLOCSYSMEM_INPUT
203 {
204 UINT_32 size; ///< Size of this structure in bytes
205
206 ADDR_ALLOCSYSMEM_FLAGS flags; ///< System memory flags.
207 UINT_32 sizeInBytes; ///< System memory allocation size in bytes.
208 ADDR_CLIENT_HANDLE hClient; ///< Client handle
209 } ADDR_ALLOCSYSMEM_INPUT;
210
211 /**
212 ****************************************************************************************************
213 * ADDR_ALLOCSYSMEM
214 * @brief
215 * Allocate system memory callback function. Returns valid pointer on success.
216 ****************************************************************************************************
217 */
218 typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)(
219 const ADDR_ALLOCSYSMEM_INPUT* pInput);
220
221 /**
222 ****************************************************************************************************
223 * @brief Free system memory input structure
224 ****************************************************************************************************
225 */
226 typedef struct _ADDR_FREESYSMEM_INPUT
227 {
228 UINT_32 size; ///< Size of this structure in bytes
229
230 VOID* pVirtAddr; ///< Virtual address
231 ADDR_CLIENT_HANDLE hClient; ///< Client handle
232 } ADDR_FREESYSMEM_INPUT;
233
234 /**
235 ****************************************************************************************************
236 * ADDR_FREESYSMEM
237 * @brief
238 * Free system memory callback function.
239 * Returns ADDR_OK on success.
240 ****************************************************************************************************
241 */
242 typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)(
243 const ADDR_FREESYSMEM_INPUT* pInput);
244
245 /**
246 ****************************************************************************************************
247 * @brief Print debug message input structure
248 ****************************************************************************************************
249 */
250 typedef struct _ADDR_DEBUGPRINT_INPUT
251 {
252 UINT_32 size; ///< Size of this structure in bytes
253
254 CHAR* pDebugString; ///< Debug print string
255 va_list ap; ///< Variable argument list
256 ADDR_CLIENT_HANDLE hClient; ///< Client handle
257 } ADDR_DEBUGPRINT_INPUT;
258
259 /**
260 ****************************************************************************************************
261 * ADDR_DEBUGPRINT
262 * @brief
263 * Print debug message callback function.
264 * Returns ADDR_OK on success.
265 ****************************************************************************************************
266 */
267 typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)(
268 const ADDR_DEBUGPRINT_INPUT* pInput);
269
270 /**
271 ****************************************************************************************************
272 * ADDR_CALLBACKS
273 *
274 * @brief
275 * Address Library needs client to provide system memory alloc/free routines.
276 ****************************************************************************************************
277 */
278 typedef struct _ADDR_CALLBACKS
279 {
280 ADDR_ALLOCSYSMEM allocSysMem; ///< Routine to allocate system memory
281 ADDR_FREESYSMEM freeSysMem; ///< Routine to free system memory
282 ADDR_DEBUGPRINT debugPrint; ///< Routine to print debug message
283 } ADDR_CALLBACKS;
284
285 ////////////////////////////////////////////////////////////////////////////////////////////////////
286 // Create/Destroy functions
287 ////////////////////////////////////////////////////////////////////////////////////////////////////
288
289 /**
290 ****************************************************************************************************
291 * ADDR_CREATE_FLAGS
292 *
293 * @brief
294 * This structure is used to pass some setup in creation of AddrLib
295 * @note
296 ****************************************************************************************************
297 */
298 typedef union _ADDR_CREATE_FLAGS
299 {
300 struct
301 {
302 UINT_32 noCubeMipSlicesPad : 1; ///< Turn cubemap faces padding off
303 UINT_32 fillSizeFields : 1; ///< If clients fill size fields in all input and
304 /// output structure
305 UINT_32 useTileIndex : 1; ///< Make tileIndex field in input valid
306 UINT_32 useCombinedSwizzle : 1; ///< Use combined tile swizzle
307 UINT_32 checkLast2DLevel : 1; ///< Check the last 2D mip sub level
308 UINT_32 useHtileSliceAlign : 1; ///< Do htile single slice alignment
309 UINT_32 allowLargeThickTile : 1; ///< Allow 64*thickness*bytesPerPixel > rowSize
310 UINT_32 forceDccAndTcCompat : 1; ///< Force enable DCC and TC compatibility
311 UINT_32 nonPower2MemConfig : 1; ///< Physical video memory size is not power of 2
312 UINT_32 reserved : 23; ///< Reserved bits for future use
313 };
314
315 UINT_32 value;
316 } ADDR_CREATE_FLAGS;
317
318 /**
319 ****************************************************************************************************
320 * ADDR_REGISTER_VALUE
321 *
322 * @brief
323 * Data from registers to setup AddrLib global data, used in AddrCreate
324 ****************************************************************************************************
325 */
326 typedef struct _ADDR_REGISTER_VALUE
327 {
328 UINT_32 gbAddrConfig; ///< For R8xx, use GB_ADDR_CONFIG register value.
329 /// For R6xx/R7xx, use GB_TILING_CONFIG.
330 /// But they can be treated as the same.
331 /// if this value is 0, use chip to set default value
332 UINT_32 backendDisables; ///< 1 bit per backend, starting with LSB. 1=disabled,0=enabled.
333 /// Register value of CC_RB_BACKEND_DISABLE.BACKEND_DISABLE
334
335 /// R800 registers-----------------------------------------------
336 UINT_32 noOfBanks; ///< Number of h/w ram banks - For r800: MC_ARB_RAMCFG.NOOFBANK
337 /// No enums for this value in h/w header files
338 /// 0: 4
339 /// 1: 8
340 /// 2: 16
341 UINT_32 noOfRanks; /// MC_ARB_RAMCFG.NOOFRANK
342 /// 0: 1
343 /// 1: 2
344 /// SI (R1000) registers-----------------------------------------
345 const UINT_32* pTileConfig; ///< Global tile setting tables
346 UINT_32 noOfEntries; ///< Number of entries in pTileConfig
347
348 ///< CI registers-------------------------------------------------
349 const UINT_32* pMacroTileConfig; ///< Global macro tile mode table
350 UINT_32 noOfMacroEntries; ///< Number of entries in pMacroTileConfig
351 } ADDR_REGISTER_VALUE;
352
353 /**
354 ****************************************************************************************************
355 * ADDR_CREATE_INPUT
356 *
357 * @brief
358 * Parameters use to create an AddrLib Object. Caller must provide all fields.
359 *
360 ****************************************************************************************************
361 */
362 typedef struct _ADDR_CREATE_INPUT
363 {
364 UINT_32 size; ///< Size of this structure in bytes
365
366 UINT_32 chipEngine; ///< Chip Engine
367 UINT_32 chipFamily; ///< Chip Family
368 UINT_32 chipRevision; ///< Chip Revision
369 ADDR_CALLBACKS callbacks; ///< Callbacks for sysmem alloc/free/print
370 ADDR_CREATE_FLAGS createFlags; ///< Flags to setup AddrLib
371 ADDR_REGISTER_VALUE regValue; ///< Data from registers to setup AddrLib global data
372 ADDR_CLIENT_HANDLE hClient; ///< Client handle
373 UINT_32 minPitchAlignPixels; ///< Minimum pitch alignment in pixels
374 } ADDR_CREATE_INPUT;
375
376 /**
377 ****************************************************************************************************
378 * ADDR_CREATEINFO_OUTPUT
379 *
380 * @brief
381 * Return AddrLib handle to client driver
382 *
383 ****************************************************************************************************
384 */
385 typedef struct _ADDR_CREATE_OUTPUT
386 {
387 UINT_32 size; ///< Size of this structure in bytes
388
389 ADDR_HANDLE hLib; ///< Address lib handle
390
391 UINT_32 numEquations; ///< Number of equations in the table
392 const ADDR_EQUATION* pEquationTable; ///< Pointer to the equation table
393 } ADDR_CREATE_OUTPUT;
394
395 /**
396 ****************************************************************************************************
397 * AddrCreate
398 *
399 * @brief
400 * Create AddrLib object, must be called before any interface calls
401 *
402 * @return
403 * ADDR_OK if successful
404 ****************************************************************************************************
405 */
406 ADDR_E_RETURNCODE ADDR_API AddrCreate(
407 const ADDR_CREATE_INPUT* pAddrCreateIn,
408 ADDR_CREATE_OUTPUT* pAddrCreateOut);
409
410 /**
411 ****************************************************************************************************
412 * AddrDestroy
413 *
414 * @brief
415 * Destroy AddrLib object, must be called to free internally allocated resources.
416 *
417 * @return
418 * ADDR_OK if successful
419 ****************************************************************************************************
420 */
421 ADDR_E_RETURNCODE ADDR_API AddrDestroy(
422 ADDR_HANDLE hLib);
423
424 ////////////////////////////////////////////////////////////////////////////////////////////////////
425 // Surface functions
426 ////////////////////////////////////////////////////////////////////////////////////////////////////
427
428 /**
429 ****************************************************************************************************
430 * @brief
431 * Bank/tiling parameters. On function input, these can be set as desired or
432 * left 0 for AddrLib to calculate/default. On function output, these are the actual
433 * parameters used.
434 * @note
435 * Valid bankWidth/bankHeight value:
436 * 1,2,4,8. They are factors instead of pixels or bytes.
437 *
438 * The bank number remains constant across each row of the
439 * macro tile as each pipe is selected, so the number of
440 * tiles in the x direction with the same bank number will
441 * be bank_width * num_pipes.
442 ****************************************************************************************************
443 */
444 typedef struct _ADDR_TILEINFO
445 {
446 /// Any of these parameters can be set to 0 to use the HW default.
447 UINT_32 banks; ///< Number of banks, numerical value
448 UINT_32 bankWidth; ///< Number of tiles in the X direction in the same bank
449 UINT_32 bankHeight; ///< Number of tiles in the Y direction in the same bank
450 UINT_32 macroAspectRatio; ///< Macro tile aspect ratio. 1-1:1, 2-4:1, 4-16:1, 8-64:1
451 UINT_32 tileSplitBytes; ///< Tile split size, in bytes
452 AddrPipeCfg pipeConfig; ///< Pipe Config = HW enum + 1
453 } ADDR_TILEINFO;
454
455 // Create a define to avoid client change. The removal of R800 is because we plan to implement SI
456 // within 800 HWL - An AddrPipeCfg is added in above data structure
457 typedef ADDR_TILEINFO ADDR_R800_TILEINFO;
458
459 /**
460 ****************************************************************************************************
461 * @brief
462 * Information needed by quad buffer stereo support
463 ****************************************************************************************************
464 */
465 typedef struct _ADDR_QBSTEREOINFO
466 {
467 UINT_32 eyeHeight; ///< Height (in pixel rows) to right eye
468 UINT_32 rightOffset; ///< Offset (in bytes) to right eye
469 UINT_32 rightSwizzle; ///< TileSwizzle for right eyes
470 } ADDR_QBSTEREOINFO;
471
472 /**
473 ****************************************************************************************************
474 * ADDR_SURFACE_FLAGS
475 *
476 * @brief
477 * Surface flags
478 ****************************************************************************************************
479 */
480 typedef union _ADDR_SURFACE_FLAGS
481 {
482 struct
483 {
484 UINT_32 color : 1; ///< Flag indicates this is a color buffer
485 UINT_32 depth : 1; ///< Flag indicates this is a depth/stencil buffer
486 UINT_32 stencil : 1; ///< Flag indicates this is a stencil buffer
487 UINT_32 texture : 1; ///< Flag indicates this is a texture
488 UINT_32 cube : 1; ///< Flag indicates this is a cubemap
489 UINT_32 volume : 1; ///< Flag indicates this is a volume texture
490 UINT_32 fmask : 1; ///< Flag indicates this is an fmask
491 UINT_32 cubeAsArray : 1; ///< Flag indicates if treat cubemap as arrays
492 UINT_32 compressZ : 1; ///< Flag indicates z buffer is compressed
493 UINT_32 overlay : 1; ///< Flag indicates this is an overlay surface
494 UINT_32 noStencil : 1; ///< Flag indicates this depth has no separate stencil
495 UINT_32 display : 1; ///< Flag indicates this should match display controller req.
496 UINT_32 opt4Space : 1; ///< Flag indicates this surface should be optimized for space
497 /// i.e. save some memory but may lose performance
498 UINT_32 prt : 1; ///< Flag for partially resident texture
499 UINT_32 qbStereo : 1; ///< Quad buffer stereo surface
500 UINT_32 pow2Pad : 1; ///< SI: Pad to pow2, must set for mipmap (include level0)
501 UINT_32 interleaved : 1; ///< Special flag for interleaved YUV surface padding
502 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable
503 UINT_32 dispTileType : 1; ///< NI: force display Tiling for 128 bit shared resoruce
504 UINT_32 dccCompatible : 1; ///< VI: whether to make MSAA surface support dcc fast clear
505 UINT_32 dccPipeWorkaround : 1; ///< VI: whether to workaround the HW limit that
506 /// dcc can't be enabled if pipe config of tile mode
507 /// is different from that of ASIC, this flag
508 /// is address lib internal flag, client should ignore it
509 UINT_32 czDispCompatible : 1; ///< SI+: CZ family has a HW bug needs special alignment.
510 /// This flag indicates we need to follow the
511 /// alignment with CZ families or other ASICs under
512 /// PX configuration + CZ.
513 UINT_32 nonSplit : 1; ///< CI: depth texture should not be split
514 UINT_32 disableLinearOpt : 1; ///< Disable tile mode optimization to linear
515 UINT_32 needEquation : 1; ///< Make the surface tile setting equation compatible.
516 /// This flag indicates we need to override tile
517 /// mode to PRT_* tile mode to disable slice rotation,
518 /// which is needed by swizzle pattern equation.
519 UINT_32 skipIndicesOutput : 1; ///< Skipping indices in output.
520 UINT_32 rotateDisplay : 1; ///< Rotate micro tile type
521 UINT_32 minimizeAlignment : 1; ///< Minimize alignment
522 UINT_32 preferEquation : 1; ///< Return equation index without adjusting tile mode
523 UINT_32 matchStencilTileCfg : 1; ///< Select tile index of stencil as well as depth surface
524 /// to make sure they share same tile config parameters
525 UINT_32 disallowLargeThickDegrade : 1; ///< Disallow large thick tile degrade
526 UINT_32 reserved : 1; ///< Reserved bits
527 };
528
529 UINT_32 value;
530 } ADDR_SURFACE_FLAGS;
531
532 /**
533 ****************************************************************************************************
534 * ADDR_COMPUTE_SURFACE_INFO_INPUT
535 *
536 * @brief
537 * Input structure for AddrComputeSurfaceInfo
538 ****************************************************************************************************
539 */
540 typedef struct _ADDR_COMPUTE_SURFACE_INFO_INPUT
541 {
542 UINT_32 size; ///< Size of this structure in bytes
543
544 AddrTileMode tileMode; ///< Tile mode
545 AddrFormat format; ///< If format is set to valid one, bpp/width/height
546 /// might be overwritten
547 UINT_32 bpp; ///< Bits per pixel
548 UINT_32 numSamples; ///< Number of samples
549 UINT_32 width; ///< Width, in pixels
550 UINT_32 height; ///< Height, in pixels
551 UINT_32 numSlices; ///< Number of surface slices or depth
552 UINT_32 slice; ///< Slice index
553 UINT_32 mipLevel; ///< Current mipmap level
554 UINT_32 numMipLevels; ///< Number of mips in mip chain
555 ADDR_SURFACE_FLAGS flags; ///< Surface type flags
556 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
557 /// number of samples for normal AA; Set it to the
558 /// number of fragments for EQAA
559 /// r800 and later HWL parameters
560 // Needed by 2D tiling, for linear and 1D tiling, just keep them 0's
561 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Set to 0 to default/calculate
562 AddrTileType tileType; ///< Micro tiling type, not needed when tileIndex != -1
563 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
564 /// while the global useTileIndex is set to 1
565 UINT_32 basePitch; ///< Base level pitch in pixels, 0 means ignored, is a
566 /// must for mip levels from SI+.
567 /// Don't use pitch in blocks for compressed formats!
568 UINT_32 maxBaseAlign; ///< Max base alignment request from client
569 UINT_32 pitchAlign; ///< Pitch alignment request from client
570 UINT_32 heightAlign; ///< Height alignment request from client
571 } ADDR_COMPUTE_SURFACE_INFO_INPUT;
572
573 /**
574 ****************************************************************************************************
575 * ADDR_COMPUTE_SURFACE_INFO_OUTPUT
576 *
577 * @brief
578 * Output structure for AddrComputeSurfInfo
579 * @note
580 Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch
581 Pixel: Original pixel
582 ****************************************************************************************************
583 */
584 typedef struct _ADDR_COMPUTE_SURFACE_INFO_OUTPUT
585 {
586 UINT_32 size; ///< Size of this structure in bytes
587
588 UINT_32 pitch; ///< Pitch in elements (in blocks for compressed formats)
589 UINT_32 height; ///< Height in elements (in blocks for compressed formats)
590 UINT_32 depth; ///< Number of slice/depth
591 UINT_64 surfSize; ///< Surface size in bytes
592 AddrTileMode tileMode; ///< Actual tile mode. May differ from that in input
593 UINT_32 baseAlign; ///< Base address alignment
594 UINT_32 pitchAlign; ///< Pitch alignment, in elements
595 UINT_32 heightAlign; ///< Height alignment, in elements
596 UINT_32 depthAlign; ///< Depth alignment, aligned to thickness, for 3d texture
597 UINT_32 bpp; ///< Bits per elements (e.g. blocks for BCn, 1/3 for 96bit)
598 UINT_32 pixelPitch; ///< Pitch in original pixels
599 UINT_32 pixelHeight; ///< Height in original pixels
600 UINT_32 pixelBits; ///< Original bits per pixel, passed from input
601 UINT_64 sliceSize; ///< Size of slice specified by input's slice
602 /// The result is controlled by surface flags & createFlags
603 /// By default this value equals to surfSize for volume
604 UINT_32 pitchTileMax; ///< PITCH_TILE_MAX value for h/w register
605 UINT_32 heightTileMax; ///< HEIGHT_TILE_MAX value for h/w register
606 UINT_32 sliceTileMax; ///< SLICE_TILE_MAX value for h/w register
607
608 UINT_32 numSamples; ///< Pass the effective numSamples processed in this call
609
610 /// r800 and later HWL parameters
611 ADDR_TILEINFO* pTileInfo; ///< Tile parameters used. Filled in if 0 on input
612 AddrTileType tileType; ///< Micro tiling type, only valid when tileIndex != -1
613 INT_32 tileIndex; ///< Tile index, MAY be "downgraded"
614
615 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
616 /// Output flags
617 struct
618 {
619 /// Special information to work around SI mipmap swizzle bug UBTS #317508
620 UINT_32 last2DLevel : 1; ///< TRUE if this is the last 2D(3D) tiled
621 ///< Only meaningful when create flag checkLast2DLevel is set
622 UINT_32 tcCompatible : 1; ///< If the surface can be shader compatible
623 UINT_32 dccUnsupport : 1; ///< If the surface can support DCC compressed rendering
624 UINT_32 prtTileIndex : 1; ///< SI only, indicate the returned tile index is for PRT
625 ///< If address lib return true for mip 0, client should set prt flag
626 ///< for child mips in subsequent compute surface info calls
627 UINT_32 reserved :28; ///< Reserved bits
628 };
629
630 UINT_32 equationIndex; ///< Equation index in the equation table;
631
632 UINT_32 blockWidth; ///< Width in element inside one block(1D->Micro, 2D->Macro)
633 UINT_32 blockHeight; ///< Height in element inside one block(1D->Micro, 2D->Macro)
634 UINT_32 blockSlices; ///< Slice number inside one block(1D->Micro, 2D->Macro)
635
636 /// Stereo info
637 ADDR_QBSTEREOINFO* pStereoInfo;///< Stereo information, needed when .qbStereo flag is TRUE
638
639 INT_32 stencilTileIdx; ///< stencil tile index output when matchStencilTileCfg was set
640 } ADDR_COMPUTE_SURFACE_INFO_OUTPUT;
641
642 /**
643 ****************************************************************************************************
644 * AddrComputeSurfaceInfo
645 *
646 * @brief
647 * Compute surface width/height/depth/alignments and suitable tiling mode
648 ****************************************************************************************************
649 */
650 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceInfo(
651 ADDR_HANDLE hLib,
652 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn,
653 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut);
654
655 /**
656 ****************************************************************************************************
657 * ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
658 *
659 * @brief
660 * Input structure for AddrComputeSurfaceAddrFromCoord
661 ****************************************************************************************************
662 */
663 typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
664 {
665 UINT_32 size; ///< Size of this structure in bytes
666
667 UINT_32 x; ///< X coordinate
668 UINT_32 y; ///< Y coordinate
669 UINT_32 slice; ///< Slice index
670 UINT_32 sample; ///< Sample index, use fragment index for EQAA
671
672 UINT_32 bpp; ///< Bits per pixel
673 UINT_32 pitch; ///< Surface pitch, in pixels
674 UINT_32 height; ///< Surface height, in pixels
675 UINT_32 numSlices; ///< Surface depth
676 UINT_32 numSamples; ///< Number of samples
677
678 AddrTileMode tileMode; ///< Tile mode
679 BOOL_32 isDepth; ///< TRUE if the surface uses depth sample ordering within
680 /// micro tile. Textures can also choose depth sample order
681 UINT_32 tileBase; ///< Base offset (in bits) inside micro tile which handles
682 /// the case that components are stored separately
683 UINT_32 compBits; ///< The component bits actually needed(for planar surface)
684
685 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
686 /// number of samples for normal AA; Set it to the
687 /// number of fragments for EQAA
688 /// r800 and later HWL parameters
689 // Used for 1D tiling above
690 AddrTileType tileType; ///< See defintion of AddrTileType
691 struct
692 {
693 UINT_32 ignoreSE : 1; ///< TRUE if shader engines are ignored. This is texture
694 /// only flag. Only non-RT texture can set this to TRUE
695 UINT_32 reserved :31; ///< Reserved for future use.
696 };
697 // 2D tiling needs following structure
698 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
699 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
700 /// while the global useTileIndex is set to 1
701 union
702 {
703 struct
704 {
705 UINT_32 bankSwizzle; ///< Bank swizzle
706 UINT_32 pipeSwizzle; ///< Pipe swizzle
707 };
708 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
709 };
710 } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT;
711
712 /**
713 ****************************************************************************************************
714 * ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
715 *
716 * @brief
717 * Output structure for AddrComputeSurfaceAddrFromCoord
718 ****************************************************************************************************
719 */
720 typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
721 {
722 UINT_32 size; ///< Size of this structure in bytes
723
724 UINT_64 addr; ///< Byte address
725 UINT_32 bitPosition; ///< Bit position within surfaceAddr, 0-7.
726 /// For surface bpp < 8, e.g. FMT_1.
727 UINT_32 prtBlockIndex; ///< Index of a PRT tile (64K block)
728 } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT;
729
730 /**
731 ****************************************************************************************************
732 * AddrComputeSurfaceAddrFromCoord
733 *
734 * @brief
735 * Compute surface address from a given coordinate.
736 ****************************************************************************************************
737 */
738 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceAddrFromCoord(
739 ADDR_HANDLE hLib,
740 const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,
741 ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut);
742
743 /**
744 ****************************************************************************************************
745 * ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
746 *
747 * @brief
748 * Input structure for AddrComputeSurfaceCoordFromAddr
749 ****************************************************************************************************
750 */
751 typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
752 {
753 UINT_32 size; ///< Size of this structure in bytes
754
755 UINT_64 addr; ///< Address in bytes
756 UINT_32 bitPosition; ///< Bit position in addr. 0-7. for surface bpp < 8,
757 /// e.g. FMT_1;
758 UINT_32 bpp; ///< Bits per pixel
759 UINT_32 pitch; ///< Pitch, in pixels
760 UINT_32 height; ///< Height in pixels
761 UINT_32 numSlices; ///< Surface depth
762 UINT_32 numSamples; ///< Number of samples
763
764 AddrTileMode tileMode; ///< Tile mode
765 BOOL_32 isDepth; ///< Surface uses depth sample ordering within micro tile.
766 /// Note: Textures can choose depth sample order as well.
767 UINT_32 tileBase; ///< Base offset (in bits) inside micro tile which handles
768 /// the case that components are stored separately
769 UINT_32 compBits; ///< The component bits actually needed(for planar surface)
770
771 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
772 /// number of samples for normal AA; Set it to the
773 /// number of fragments for EQAA
774 /// r800 and later HWL parameters
775 // Used for 1D tiling above
776 AddrTileType tileType; ///< See defintion of AddrTileType
777 struct
778 {
779 UINT_32 ignoreSE : 1; ///< TRUE if shader engines are ignored. This is texture
780 /// only flag. Only non-RT texture can set this to TRUE
781 UINT_32 reserved :31; ///< Reserved for future use.
782 };
783 // 2D tiling needs following structure
784 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
785 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
786 /// while the global useTileIndex is set to 1
787 union
788 {
789 struct
790 {
791 UINT_32 bankSwizzle; ///< Bank swizzle
792 UINT_32 pipeSwizzle; ///< Pipe swizzle
793 };
794 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
795 };
796 } ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT;
797
798 /**
799 ****************************************************************************************************
800 * ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
801 *
802 * @brief
803 * Output structure for AddrComputeSurfaceCoordFromAddr
804 ****************************************************************************************************
805 */
806 typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
807 {
808 UINT_32 size; ///< Size of this structure in bytes
809
810 UINT_32 x; ///< X coordinate
811 UINT_32 y; ///< Y coordinate
812 UINT_32 slice; ///< Index of slices
813 UINT_32 sample; ///< Index of samples, means fragment index for EQAA
814 } ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT;
815
816 /**
817 ****************************************************************************************************
818 * AddrComputeSurfaceCoordFromAddr
819 *
820 * @brief
821 * Compute coordinate from a given surface address
822 ****************************************************************************************************
823 */
824 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceCoordFromAddr(
825 ADDR_HANDLE hLib,
826 const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,
827 ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut);
828
829 ////////////////////////////////////////////////////////////////////////////////////////////////////
830 // HTile functions
831 ////////////////////////////////////////////////////////////////////////////////////////////////////
832
833 /**
834 ****************************************************************************************************
835 * ADDR_HTILE_FLAGS
836 *
837 * @brief
838 * HTILE flags
839 ****************************************************************************************************
840 */
841 typedef union _ADDR_HTILE_FLAGS
842 {
843 struct
844 {
845 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable
846 UINT_32 skipTcCompatSizeAlign : 1; ///< Flag indicates that addrLib will not align htile
847 /// size to 256xBankxPipe when computing tc-compatible
848 /// htile info.
849 UINT_32 reserved : 30; ///< Reserved bits
850 };
851
852 UINT_32 value;
853 } ADDR_HTILE_FLAGS;
854
855 /**
856 ****************************************************************************************************
857 * ADDR_COMPUTE_HTILE_INFO_INPUT
858 *
859 * @brief
860 * Input structure of AddrComputeHtileInfo
861 ****************************************************************************************************
862 */
863 typedef struct _ADDR_COMPUTE_HTILE_INFO_INPUT
864 {
865 UINT_32 size; ///< Size of this structure in bytes
866
867 ADDR_HTILE_FLAGS flags; ///< HTILE flags
868 UINT_32 pitch; ///< Surface pitch, in pixels
869 UINT_32 height; ///< Surface height, in pixels
870 UINT_32 numSlices; ///< Number of slices
871 BOOL_32 isLinear; ///< Linear or tiled HTILE layout
872 AddrHtileBlockSize blockWidth; ///< 4 or 8. EG above only support 8
873 AddrHtileBlockSize blockHeight; ///< 4 or 8. EG above only support 8
874 ADDR_TILEINFO* pTileInfo; ///< Tile info
875
876 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
877 /// while the global useTileIndex is set to 1
878 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
879 ///< README: When tileIndex is not -1, this must be valid
880 } ADDR_COMPUTE_HTILE_INFO_INPUT;
881
882 /**
883 ****************************************************************************************************
884 * ADDR_COMPUTE_HTILE_INFO_OUTPUT
885 *
886 * @brief
887 * Output structure of AddrComputeHtileInfo
888 ****************************************************************************************************
889 */
890 typedef struct _ADDR_COMPUTE_HTILE_INFO_OUTPUT
891 {
892 UINT_32 size; ///< Size of this structure in bytes
893
894 UINT_32 pitch; ///< Pitch in pixels of depth buffer represented in this
895 /// HTile buffer. This might be larger than original depth
896 /// buffer pitch when called with an unaligned pitch.
897 UINT_32 height; ///< Height in pixels, as above
898 UINT_64 htileBytes; ///< Size of HTILE buffer, in bytes
899 UINT_32 baseAlign; ///< Base alignment
900 UINT_32 bpp; ///< Bits per pixel for HTILE is how many bits for an 8x8 block!
901 UINT_32 macroWidth; ///< Macro width in pixels, actually squared cache shape
902 UINT_32 macroHeight; ///< Macro height in pixels
903 UINT_64 sliceSize; ///< Slice size, in bytes.
904 BOOL_32 sliceInterleaved; ///< Flag to indicate if different slice's htile is interleaved
905 /// Compute engine clear can't be used if htile is interleaved
906 BOOL_32 nextMipLevelCompressible; ///< Flag to indicate whether HTILE can be enabled in
907 /// next mip level, it also indicates if memory set based
908 /// fast clear can be used for current mip level.
909 } ADDR_COMPUTE_HTILE_INFO_OUTPUT;
910
911 /**
912 ****************************************************************************************************
913 * AddrComputeHtileInfo
914 *
915 * @brief
916 * Compute Htile pitch, height, base alignment and size in bytes
917 ****************************************************************************************************
918 */
919 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileInfo(
920 ADDR_HANDLE hLib,
921 const ADDR_COMPUTE_HTILE_INFO_INPUT* pIn,
922 ADDR_COMPUTE_HTILE_INFO_OUTPUT* pOut);
923
924 /**
925 ****************************************************************************************************
926 * ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
927 *
928 * @brief
929 * Input structure for AddrComputeHtileAddrFromCoord
930 ****************************************************************************************************
931 */
932 typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
933 {
934 UINT_32 size; ///< Size of this structure in bytes
935
936 UINT_32 pitch; ///< Pitch, in pixels
937 UINT_32 height; ///< Height in pixels
938 UINT_32 x; ///< X coordinate
939 UINT_32 y; ///< Y coordinate
940 UINT_32 slice; ///< Index of slice
941 UINT_32 numSlices; ///< Number of slices
942 BOOL_32 isLinear; ///< Linear or tiled HTILE layout
943 ADDR_HTILE_FLAGS flags; ///< htile flags
944 AddrHtileBlockSize blockWidth; ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8
945 AddrHtileBlockSize blockHeight; ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8
946 ADDR_TILEINFO* pTileInfo; ///< Tile info
947
948 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
949 /// while the global useTileIndex is set to 1
950 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
951 ///< README: When tileIndex is not -1, this must be valid
952 UINT_32 bpp; ///< depth/stencil buffer bit per pixel size
953 UINT_32 zStencilAddr; ///< tcCompatible Z/Stencil surface address
954 } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT;
955
956 /**
957 ****************************************************************************************************
958 * ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
959 *
960 * @brief
961 * Output structure for AddrComputeHtileAddrFromCoord
962 ****************************************************************************************************
963 */
964 typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
965 {
966 UINT_32 size; ///< Size of this structure in bytes
967
968 UINT_64 addr; ///< Address in bytes
969 UINT_32 bitPosition; ///< Bit position, 0 or 4. CMASK and HTILE shares some lib method.
970 /// So we keep bitPosition for HTILE as well
971 } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT;
972
973 /**
974 ****************************************************************************************************
975 * AddrComputeHtileAddrFromCoord
976 *
977 * @brief
978 * Compute Htile address according to coordinates (of depth buffer)
979 ****************************************************************************************************
980 */
981 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileAddrFromCoord(
982 ADDR_HANDLE hLib,
983 const ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn,
984 ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut);
985
986 /**
987 ****************************************************************************************************
988 * ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT
989 *
990 * @brief
991 * Input structure for AddrComputeHtileCoordFromAddr
992 ****************************************************************************************************
993 */
994 typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT
995 {
996 UINT_32 size; ///< Size of this structure in bytes
997
998 UINT_64 addr; ///< Address
999 UINT_32 bitPosition; ///< Bit position 0 or 4. CMASK and HTILE share some methods
1000 /// so we keep bitPosition for HTILE as well
1001 UINT_32 pitch; ///< Pitch, in pixels
1002 UINT_32 height; ///< Height, in pixels
1003 UINT_32 numSlices; ///< Number of slices
1004 BOOL_32 isLinear; ///< Linear or tiled HTILE layout
1005 AddrHtileBlockSize blockWidth; ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8
1006 AddrHtileBlockSize blockHeight; ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8
1007 ADDR_TILEINFO* pTileInfo; ///< Tile info
1008
1009 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1010 /// while the global useTileIndex is set to 1
1011 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1012 ///< README: When tileIndex is not -1, this must be valid
1013 } ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT;
1014
1015 /**
1016 ****************************************************************************************************
1017 * ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
1018 *
1019 * @brief
1020 * Output structure for AddrComputeHtileCoordFromAddr
1021 ****************************************************************************************************
1022 */
1023 typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
1024 {
1025 UINT_32 size; ///< Size of this structure in bytes
1026
1027 UINT_32 x; ///< X coordinate
1028 UINT_32 y; ///< Y coordinate
1029 UINT_32 slice; ///< Slice index
1030 } ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT;
1031
1032 /**
1033 ****************************************************************************************************
1034 * AddrComputeHtileCoordFromAddr
1035 *
1036 * @brief
1037 * Compute coordinates within depth buffer (1st pixel of a micro tile) according to
1038 * Htile address
1039 ****************************************************************************************************
1040 */
1041 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileCoordFromAddr(
1042 ADDR_HANDLE hLib,
1043 const ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn,
1044 ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut);
1045
1046 ////////////////////////////////////////////////////////////////////////////////////////////////////
1047 // C-mask functions
1048 ////////////////////////////////////////////////////////////////////////////////////////////////////
1049
1050 /**
1051 ****************************************************************************************************
1052 * ADDR_CMASK_FLAGS
1053 *
1054 * @brief
1055 * CMASK flags
1056 ****************************************************************************************************
1057 */
1058 typedef union _ADDR_CMASK_FLAGS
1059 {
1060 struct
1061 {
1062 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable
1063 UINT_32 reserved :31; ///< Reserved bits
1064 };
1065
1066 UINT_32 value;
1067 } ADDR_CMASK_FLAGS;
1068
1069 /**
1070 ****************************************************************************************************
1071 * ADDR_COMPUTE_CMASK_INFO_INPUT
1072 *
1073 * @brief
1074 * Input structure of AddrComputeCmaskInfo
1075 ****************************************************************************************************
1076 */
1077 typedef struct _ADDR_COMPUTE_CMASKINFO_INPUT
1078 {
1079 UINT_32 size; ///< Size of this structure in bytes
1080
1081 ADDR_CMASK_FLAGS flags; ///< CMASK flags
1082 UINT_32 pitch; ///< Pitch, in pixels, of color buffer
1083 UINT_32 height; ///< Height, in pixels, of color buffer
1084 UINT_32 numSlices; ///< Number of slices, of color buffer
1085 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear
1086 ADDR_TILEINFO* pTileInfo; ///< Tile info
1087
1088 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1089 /// while the global useTileIndex is set to 1
1090 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1091 ///< README: When tileIndex is not -1, this must be valid
1092 } ADDR_COMPUTE_CMASK_INFO_INPUT;
1093
1094 /**
1095 ****************************************************************************************************
1096 * ADDR_COMPUTE_CMASK_INFO_OUTPUT
1097 *
1098 * @brief
1099 * Output structure of AddrComputeCmaskInfo
1100 ****************************************************************************************************
1101 */
1102 typedef struct _ADDR_COMPUTE_CMASK_INFO_OUTPUT
1103 {
1104 UINT_32 size; ///< Size of this structure in bytes
1105
1106 UINT_32 pitch; ///< Pitch in pixels of color buffer which
1107 /// this Cmask matches. The size might be larger than
1108 /// original color buffer pitch when called with
1109 /// an unaligned pitch.
1110 UINT_32 height; ///< Height in pixels, as above
1111 UINT_64 cmaskBytes; ///< Size in bytes of CMask buffer
1112 UINT_32 baseAlign; ///< Base alignment
1113 UINT_32 blockMax; ///< Cmask block size. Need this to set CB_COLORn_MASK register
1114 UINT_32 macroWidth; ///< Macro width in pixels, actually squared cache shape
1115 UINT_32 macroHeight; ///< Macro height in pixels
1116 UINT_64 sliceSize; ///< Slice size, in bytes.
1117 } ADDR_COMPUTE_CMASK_INFO_OUTPUT;
1118
1119 /**
1120 ****************************************************************************************************
1121 * AddrComputeCmaskInfo
1122 *
1123 * @brief
1124 * Compute Cmask pitch, height, base alignment and size in bytes from color buffer
1125 * info
1126 ****************************************************************************************************
1127 */
1128 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskInfo(
1129 ADDR_HANDLE hLib,
1130 const ADDR_COMPUTE_CMASK_INFO_INPUT* pIn,
1131 ADDR_COMPUTE_CMASK_INFO_OUTPUT* pOut);
1132
1133 /**
1134 ****************************************************************************************************
1135 * ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
1136 *
1137 * @brief
1138 * Input structure for AddrComputeCmaskAddrFromCoord
1139 *
1140 ****************************************************************************************************
1141 */
1142 typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
1143 {
1144 UINT_32 size; ///< Size of this structure in bytes
1145 UINT_32 x; ///< X coordinate
1146 UINT_32 y; ///< Y coordinate
1147 UINT_64 fmaskAddr; ///< Fmask addr for tc compatible Cmask
1148 UINT_32 slice; ///< Slice index
1149 UINT_32 pitch; ///< Pitch in pixels, of color buffer
1150 UINT_32 height; ///< Height in pixels, of color buffer
1151 UINT_32 numSlices; ///< Number of slices
1152 UINT_32 bpp;
1153 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear
1154 ADDR_CMASK_FLAGS flags; ///< CMASK flags
1155 ADDR_TILEINFO* pTileInfo; ///< Tile info
1156
1157 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1158 ///< while the global useTileIndex is set to 1
1159 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1160 ///< README: When tileIndex is not -1, this must be valid
1161 } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT;
1162
1163 /**
1164 ****************************************************************************************************
1165 * ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
1166 *
1167 * @brief
1168 * Output structure for AddrComputeCmaskAddrFromCoord
1169 ****************************************************************************************************
1170 */
1171 typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
1172 {
1173 UINT_32 size; ///< Size of this structure in bytes
1174
1175 UINT_64 addr; ///< CMASK address in bytes
1176 UINT_32 bitPosition; ///< Bit position within addr, 0-7. CMASK is 4 bpp,
1177 /// so the address may be located in bit 0 (0) or 4 (4)
1178 } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT;
1179
1180 /**
1181 ****************************************************************************************************
1182 * AddrComputeCmaskAddrFromCoord
1183 *
1184 * @brief
1185 * Compute Cmask address according to coordinates (of MSAA color buffer)
1186 ****************************************************************************************************
1187 */
1188 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskAddrFromCoord(
1189 ADDR_HANDLE hLib,
1190 const ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn,
1191 ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut);
1192
1193 /**
1194 ****************************************************************************************************
1195 * ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT
1196 *
1197 * @brief
1198 * Input structure for AddrComputeCmaskCoordFromAddr
1199 ****************************************************************************************************
1200 */
1201 typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT
1202 {
1203 UINT_32 size; ///< Size of this structure in bytes
1204
1205 UINT_64 addr; ///< CMASK address in bytes
1206 UINT_32 bitPosition; ///< Bit position within addr, 0-7. CMASK is 4 bpp,
1207 /// so the address may be located in bit 0 (0) or 4 (4)
1208 UINT_32 pitch; ///< Pitch, in pixels
1209 UINT_32 height; ///< Height in pixels
1210 UINT_32 numSlices; ///< Number of slices
1211 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear
1212 ADDR_TILEINFO* pTileInfo; ///< Tile info
1213
1214 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1215 /// while the global useTileIndex is set to 1
1216 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1217 ///< README: When tileIndex is not -1, this must be valid
1218 } ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT;
1219
1220 /**
1221 ****************************************************************************************************
1222 * ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
1223 *
1224 * @brief
1225 * Output structure for AddrComputeCmaskCoordFromAddr
1226 ****************************************************************************************************
1227 */
1228 typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
1229 {
1230 UINT_32 size; ///< Size of this structure in bytes
1231
1232 UINT_32 x; ///< X coordinate
1233 UINT_32 y; ///< Y coordinate
1234 UINT_32 slice; ///< Slice index
1235 } ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT;
1236
1237 /**
1238 ****************************************************************************************************
1239 * AddrComputeCmaskCoordFromAddr
1240 *
1241 * @brief
1242 * Compute coordinates within color buffer (1st pixel of a micro tile) according to
1243 * Cmask address
1244 ****************************************************************************************************
1245 */
1246 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskCoordFromAddr(
1247 ADDR_HANDLE hLib,
1248 const ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT* pIn,
1249 ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT* pOut);
1250
1251 ////////////////////////////////////////////////////////////////////////////////////////////////////
1252 // F-mask functions
1253 ////////////////////////////////////////////////////////////////////////////////////////////////////
1254
1255 /**
1256 ****************************************************************************************************
1257 * ADDR_COMPUTE_FMASK_INFO_INPUT
1258 *
1259 * @brief
1260 * Input structure for AddrComputeFmaskInfo
1261 ****************************************************************************************************
1262 */
1263 typedef struct _ADDR_COMPUTE_FMASK_INFO_INPUT
1264 {
1265 UINT_32 size; ///< Size of this structure in bytes
1266
1267 AddrTileMode tileMode; ///< Tile mode
1268 UINT_32 pitch; ///< Surface pitch, in pixels
1269 UINT_32 height; ///< Surface height, in pixels
1270 UINT_32 numSlices; ///< Number of slice/depth
1271 UINT_32 numSamples; ///< Number of samples
1272 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
1273 /// number of samples for normal AA; Set it to the
1274 /// number of fragments for EQAA
1275 /// r800 and later HWL parameters
1276 struct
1277 {
1278 UINT_32 resolved: 1; ///< TRUE if the surface is for resolved fmask, only used
1279 /// by H/W clients. S/W should always set it to FALSE.
1280 UINT_32 reserved: 31; ///< Reserved for future use.
1281 };
1282 ADDR_TILEINFO* pTileInfo; ///< 2D tiling parameters. Clients must give valid data
1283 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1284 /// while the global useTileIndex is set to 1
1285 } ADDR_COMPUTE_FMASK_INFO_INPUT;
1286
1287 /**
1288 ****************************************************************************************************
1289 * ADDR_COMPUTE_FMASK_INFO_OUTPUT
1290 *
1291 * @brief
1292 * Output structure for AddrComputeFmaskInfo
1293 ****************************************************************************************************
1294 */
1295 typedef struct _ADDR_COMPUTE_FMASK_INFO_OUTPUT
1296 {
1297 UINT_32 size; ///< Size of this structure in bytes
1298
1299 UINT_32 pitch; ///< Pitch of fmask in pixels
1300 UINT_32 height; ///< Height of fmask in pixels
1301 UINT_32 numSlices; ///< Slices of fmask
1302 UINT_64 fmaskBytes; ///< Size of fmask in bytes
1303 UINT_32 baseAlign; ///< Base address alignment
1304 UINT_32 pitchAlign; ///< Pitch alignment
1305 UINT_32 heightAlign; ///< Height alignment
1306 UINT_32 bpp; ///< Bits per pixel of FMASK is: number of bit planes
1307 UINT_32 numSamples; ///< Number of samples, used for dump, export this since input
1308 /// may be changed in 9xx and above
1309 /// r800 and later HWL parameters
1310 ADDR_TILEINFO* pTileInfo; ///< Tile parameters used. Fmask can have different
1311 /// bank_height from color buffer
1312 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1313 /// while the global useTileIndex is set to 1
1314 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1315 UINT_64 sliceSize; ///< Size of slice in bytes
1316 } ADDR_COMPUTE_FMASK_INFO_OUTPUT;
1317
1318 /**
1319 ****************************************************************************************************
1320 * AddrComputeFmaskInfo
1321 *
1322 * @brief
1323 * Compute Fmask pitch/height/depth/alignments and size in bytes
1324 ****************************************************************************************************
1325 */
1326 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskInfo(
1327 ADDR_HANDLE hLib,
1328 const ADDR_COMPUTE_FMASK_INFO_INPUT* pIn,
1329 ADDR_COMPUTE_FMASK_INFO_OUTPUT* pOut);
1330
1331 /**
1332 ****************************************************************************************************
1333 * ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
1334 *
1335 * @brief
1336 * Input structure for AddrComputeFmaskAddrFromCoord
1337 ****************************************************************************************************
1338 */
1339 typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
1340 {
1341 UINT_32 size; ///< Size of this structure in bytes
1342
1343 UINT_32 x; ///< X coordinate
1344 UINT_32 y; ///< Y coordinate
1345 UINT_32 slice; ///< Slice index
1346 UINT_32 plane; ///< Plane number
1347 UINT_32 sample; ///< Sample index (fragment index for EQAA)
1348
1349 UINT_32 pitch; ///< Surface pitch, in pixels
1350 UINT_32 height; ///< Surface height, in pixels
1351 UINT_32 numSamples; ///< Number of samples
1352 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
1353 /// number of samples for normal AA; Set it to the
1354 /// number of fragments for EQAA
1355
1356 AddrTileMode tileMode; ///< Tile mode
1357 union
1358 {
1359 struct
1360 {
1361 UINT_32 bankSwizzle; ///< Bank swizzle
1362 UINT_32 pipeSwizzle; ///< Pipe swizzle
1363 };
1364 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
1365 };
1366
1367 /// r800 and later HWL parameters
1368 struct
1369 {
1370 UINT_32 resolved: 1; ///< TRUE if this is a resolved fmask, used by H/W clients
1371 UINT_32 ignoreSE: 1; ///< TRUE if shader engines are ignored.
1372 UINT_32 reserved: 30; ///< Reserved for future use.
1373 };
1374 ADDR_TILEINFO* pTileInfo; ///< 2D tiling parameters. Client must provide all data
1375
1376 } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT;
1377
1378 /**
1379 ****************************************************************************************************
1380 * ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
1381 *
1382 * @brief
1383 * Output structure for AddrComputeFmaskAddrFromCoord
1384 ****************************************************************************************************
1385 */
1386 typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
1387 {
1388 UINT_32 size; ///< Size of this structure in bytes
1389
1390 UINT_64 addr; ///< Fmask address
1391 UINT_32 bitPosition; ///< Bit position within fmaskAddr, 0-7.
1392 } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT;
1393
1394 /**
1395 ****************************************************************************************************
1396 * AddrComputeFmaskAddrFromCoord
1397 *
1398 * @brief
1399 * Compute Fmask address according to coordinates (x,y,slice,sample,plane)
1400 ****************************************************************************************************
1401 */
1402 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskAddrFromCoord(
1403 ADDR_HANDLE hLib,
1404 const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn,
1405 ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut);
1406
1407 /**
1408 ****************************************************************************************************
1409 * ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
1410 *
1411 * @brief
1412 * Input structure for AddrComputeFmaskCoordFromAddr
1413 ****************************************************************************************************
1414 */
1415 typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
1416 {
1417 UINT_32 size; ///< Size of this structure in bytes
1418
1419 UINT_64 addr; ///< Address
1420 UINT_32 bitPosition; ///< Bit position within addr, 0-7.
1421
1422 UINT_32 pitch; ///< Pitch, in pixels
1423 UINT_32 height; ///< Height in pixels
1424 UINT_32 numSamples; ///< Number of samples
1425 UINT_32 numFrags; ///< Number of fragments
1426 AddrTileMode tileMode; ///< Tile mode
1427 union
1428 {
1429 struct
1430 {
1431 UINT_32 bankSwizzle; ///< Bank swizzle
1432 UINT_32 pipeSwizzle; ///< Pipe swizzle
1433 };
1434 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE
1435 };
1436
1437 /// r800 and later HWL parameters
1438 struct
1439 {
1440 UINT_32 resolved: 1; ///< TRUE if this is a resolved fmask, used by HW components
1441 UINT_32 ignoreSE: 1; ///< TRUE if shader engines are ignored.
1442 UINT_32 reserved: 30; ///< Reserved for future use.
1443 };
1444 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
1445
1446 } ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT;
1447
1448 /**
1449 ****************************************************************************************************
1450 * ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
1451 *
1452 * @brief
1453 * Output structure for AddrComputeFmaskCoordFromAddr
1454 ****************************************************************************************************
1455 */
1456 typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
1457 {
1458 UINT_32 size; ///< Size of this structure in bytes
1459
1460 UINT_32 x; ///< X coordinate
1461 UINT_32 y; ///< Y coordinate
1462 UINT_32 slice; ///< Slice index
1463 UINT_32 plane; ///< Plane number
1464 UINT_32 sample; ///< Sample index (fragment index for EQAA)
1465 } ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT;
1466
1467 /**
1468 ****************************************************************************************************
1469 * AddrComputeFmaskCoordFromAddr
1470 *
1471 * @brief
1472 * Compute FMASK coordinate from an given address
1473 ****************************************************************************************************
1474 */
1475 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskCoordFromAddr(
1476 ADDR_HANDLE hLib,
1477 const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn,
1478 ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut);
1479
1480 ////////////////////////////////////////////////////////////////////////////////////////////////////
1481 // Element/utility functions
1482 ////////////////////////////////////////////////////////////////////////////////////////////////////
1483
1484 /**
1485 ****************************************************************************************************
1486 * AddrGetVersion
1487 *
1488 * @brief
1489 * Get AddrLib version number
1490 ****************************************************************************************************
1491 */
1492 UINT_32 ADDR_API AddrGetVersion(ADDR_HANDLE hLib);
1493
1494 /**
1495 ****************************************************************************************************
1496 * AddrUseTileIndex
1497 *
1498 * @brief
1499 * Return TRUE if tileIndex is enabled in this address library
1500 ****************************************************************************************************
1501 */
1502 BOOL_32 ADDR_API AddrUseTileIndex(ADDR_HANDLE hLib);
1503
1504 /**
1505 ****************************************************************************************************
1506 * AddrUseCombinedSwizzle
1507 *
1508 * @brief
1509 * Return TRUE if combined swizzle is enabled in this address library
1510 ****************************************************************************************************
1511 */
1512 BOOL_32 ADDR_API AddrUseCombinedSwizzle(ADDR_HANDLE hLib);
1513
1514 /**
1515 ****************************************************************************************************
1516 * ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
1517 *
1518 * @brief
1519 * Input structure of AddrExtractBankPipeSwizzle
1520 ****************************************************************************************************
1521 */
1522 typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
1523 {
1524 UINT_32 size; ///< Size of this structure in bytes
1525
1526 UINT_32 base256b; ///< Base256b value
1527
1528 /// r800 and later HWL parameters
1529 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
1530
1531 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1532 /// while the global useTileIndex is set to 1
1533 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1534 ///< README: When tileIndex is not -1, this must be valid
1535 } ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT;
1536
1537 /**
1538 ****************************************************************************************************
1539 * ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
1540 *
1541 * @brief
1542 * Output structure of AddrExtractBankPipeSwizzle
1543 ****************************************************************************************************
1544 */
1545 typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
1546 {
1547 UINT_32 size; ///< Size of this structure in bytes
1548
1549 UINT_32 bankSwizzle; ///< Bank swizzle
1550 UINT_32 pipeSwizzle; ///< Pipe swizzle
1551 } ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT;
1552
1553 /**
1554 ****************************************************************************************************
1555 * AddrExtractBankPipeSwizzle
1556 *
1557 * @brief
1558 * Extract Bank and Pipe swizzle from base256b
1559 * @return
1560 * ADDR_OK if no error
1561 ****************************************************************************************************
1562 */
1563 ADDR_E_RETURNCODE ADDR_API AddrExtractBankPipeSwizzle(
1564 ADDR_HANDLE hLib,
1565 const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT* pIn,
1566 ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT* pOut);
1567
1568 /**
1569 ****************************************************************************************************
1570 * ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT
1571 *
1572 * @brief
1573 * Input structure of AddrCombineBankPipeSwizzle
1574 ****************************************************************************************************
1575 */
1576 typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT
1577 {
1578 UINT_32 size; ///< Size of this structure in bytes
1579
1580 UINT_32 bankSwizzle; ///< Bank swizzle
1581 UINT_32 pipeSwizzle; ///< Pipe swizzle
1582 UINT_64 baseAddr; ///< Base address (leave it zero for driver clients)
1583
1584 /// r800 and later HWL parameters
1585 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data
1586
1587 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1588 /// while the global useTileIndex is set to 1
1589 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1590 ///< README: When tileIndex is not -1, this must be valid
1591 } ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT;
1592
1593 /**
1594 ****************************************************************************************************
1595 * ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT
1596 *
1597 * @brief
1598 * Output structure of AddrCombineBankPipeSwizzle
1599 ****************************************************************************************************
1600 */
1601 typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT
1602 {
1603 UINT_32 size; ///< Size of this structure in bytes
1604
1605 UINT_32 tileSwizzle; ///< Combined swizzle
1606 } ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT;
1607
1608 /**
1609 ****************************************************************************************************
1610 * AddrCombineBankPipeSwizzle
1611 *
1612 * @brief
1613 * Combine Bank and Pipe swizzle
1614 * @return
1615 * ADDR_OK if no error
1616 * @note
1617 * baseAddr here is full MCAddress instead of base256b
1618 ****************************************************************************************************
1619 */
1620 ADDR_E_RETURNCODE ADDR_API AddrCombineBankPipeSwizzle(
1621 ADDR_HANDLE hLib,
1622 const ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT* pIn,
1623 ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT* pOut);
1624
1625 /**
1626 ****************************************************************************************************
1627 * ADDR_COMPUTE_SLICESWIZZLE_INPUT
1628 *
1629 * @brief
1630 * Input structure of AddrComputeSliceSwizzle
1631 ****************************************************************************************************
1632 */
1633 typedef struct _ADDR_COMPUTE_SLICESWIZZLE_INPUT
1634 {
1635 UINT_32 size; ///< Size of this structure in bytes
1636
1637 AddrTileMode tileMode; ///< Tile Mode
1638 UINT_32 baseSwizzle; ///< Base tile swizzle
1639 UINT_32 slice; ///< Slice index
1640 UINT_64 baseAddr; ///< Base address, driver should leave it 0 in most cases
1641
1642 /// r800 and later HWL parameters
1643 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Actually banks needed here!
1644
1645 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1646 /// while the global useTileIndex is set to 1
1647 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1648 ///< README: When tileIndex is not -1, this must be valid
1649 } ADDR_COMPUTE_SLICESWIZZLE_INPUT;
1650
1651 /**
1652 ****************************************************************************************************
1653 * ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
1654 *
1655 * @brief
1656 * Output structure of AddrComputeSliceSwizzle
1657 ****************************************************************************************************
1658 */
1659 typedef struct _ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
1660 {
1661 UINT_32 size; ///< Size of this structure in bytes
1662
1663 UINT_32 tileSwizzle; ///< Recalculated tileSwizzle value
1664 } ADDR_COMPUTE_SLICESWIZZLE_OUTPUT;
1665
1666 /**
1667 ****************************************************************************************************
1668 * AddrComputeSliceSwizzle
1669 *
1670 * @brief
1671 * Extract Bank and Pipe swizzle from base256b
1672 * @return
1673 * ADDR_OK if no error
1674 ****************************************************************************************************
1675 */
1676 ADDR_E_RETURNCODE ADDR_API AddrComputeSliceSwizzle(
1677 ADDR_HANDLE hLib,
1678 const ADDR_COMPUTE_SLICESWIZZLE_INPUT* pIn,
1679 ADDR_COMPUTE_SLICESWIZZLE_OUTPUT* pOut);
1680
1681 /**
1682 ****************************************************************************************************
1683 * AddrSwizzleGenOption
1684 *
1685 * @brief
1686 * Which swizzle generating options: legacy or linear
1687 ****************************************************************************************************
1688 */
1689 typedef enum _AddrSwizzleGenOption
1690 {
1691 ADDR_SWIZZLE_GEN_DEFAULT = 0, ///< As is in client driver implemention for swizzle
1692 ADDR_SWIZZLE_GEN_LINEAR = 1, ///< Using a linear increment of swizzle
1693 } AddrSwizzleGenOption;
1694
1695 /**
1696 ****************************************************************************************************
1697 * AddrSwizzleOption
1698 *
1699 * @brief
1700 * Controls how swizzle is generated
1701 ****************************************************************************************************
1702 */
1703 typedef union _ADDR_SWIZZLE_OPTION
1704 {
1705 struct
1706 {
1707 UINT_32 genOption : 1; ///< The way swizzle is generated, see AddrSwizzleGenOption
1708 UINT_32 reduceBankBit : 1; ///< TRUE if we need reduce swizzle bits
1709 UINT_32 reserved :30; ///< Reserved bits
1710 };
1711
1712 UINT_32 value;
1713
1714 } ADDR_SWIZZLE_OPTION;
1715
1716 /**
1717 ****************************************************************************************************
1718 * ADDR_COMPUTE_BASE_SWIZZLE_INPUT
1719 *
1720 * @brief
1721 * Input structure of AddrComputeBaseSwizzle
1722 ****************************************************************************************************
1723 */
1724 typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_INPUT
1725 {
1726 UINT_32 size; ///< Size of this structure in bytes
1727
1728 ADDR_SWIZZLE_OPTION option; ///< Swizzle option
1729 UINT_32 surfIndex; ///< Index of this surface type
1730 AddrTileMode tileMode; ///< Tile Mode
1731
1732 /// r800 and later HWL parameters
1733 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Actually banks needed here!
1734
1735 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1736 /// while the global useTileIndex is set to 1
1737 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1738 ///< README: When tileIndex is not -1, this must be valid
1739 } ADDR_COMPUTE_BASE_SWIZZLE_INPUT;
1740
1741 /**
1742 ****************************************************************************************************
1743 * ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
1744 *
1745 * @brief
1746 * Output structure of AddrComputeBaseSwizzle
1747 ****************************************************************************************************
1748 */
1749 typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
1750 {
1751 UINT_32 size; ///< Size of this structure in bytes
1752
1753 UINT_32 tileSwizzle; ///< Combined swizzle
1754 } ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT;
1755
1756 /**
1757 ****************************************************************************************************
1758 * AddrComputeBaseSwizzle
1759 *
1760 * @brief
1761 * Return a Combined Bank and Pipe swizzle base on surface based on surface type/index
1762 * @return
1763 * ADDR_OK if no error
1764 ****************************************************************************************************
1765 */
1766 ADDR_E_RETURNCODE ADDR_API AddrComputeBaseSwizzle(
1767 ADDR_HANDLE hLib,
1768 const ADDR_COMPUTE_BASE_SWIZZLE_INPUT* pIn,
1769 ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT* pOut);
1770
1771 /**
1772 ****************************************************************************************************
1773 * ELEM_GETEXPORTNORM_INPUT
1774 *
1775 * @brief
1776 * Input structure for ElemGetExportNorm
1777 *
1778 ****************************************************************************************************
1779 */
1780 typedef struct _ELEM_GETEXPORTNORM_INPUT
1781 {
1782 UINT_32 size; ///< Size of this structure in bytes
1783
1784 AddrColorFormat format; ///< Color buffer format; Client should use ColorFormat
1785 AddrSurfaceNumber num; ///< Surface number type; Client should use NumberType
1786 AddrSurfaceSwap swap; ///< Surface swap byte swap; Client should use SurfaceSwap
1787 UINT_32 numSamples; ///< Number of samples
1788 } ELEM_GETEXPORTNORM_INPUT;
1789
1790 /**
1791 ****************************************************************************************************
1792 * ElemGetExportNorm
1793 *
1794 * @brief
1795 * Helper function to check one format can be EXPORT_NUM, which is a register
1796 * CB_COLOR_INFO.SURFACE_FORMAT. FP16 can be reported as EXPORT_NORM for rv770 in r600
1797 * family
1798 * @note
1799 * The implementation is only for r600.
1800 * 00 - EXPORT_FULL: PS exports are 4 pixels with 4 components with 32-bits-per-component. (two
1801 * clocks per export)
1802 * 01 - EXPORT_NORM: PS exports are 4 pixels with 4 components with 16-bits-per-component. (one
1803 * clock per export)
1804 *
1805 ****************************************************************************************************
1806 */
1807 BOOL_32 ADDR_API ElemGetExportNorm(
1808 ADDR_HANDLE hLib,
1809 const ELEM_GETEXPORTNORM_INPUT* pIn);
1810
1811 /**
1812 ****************************************************************************************************
1813 * ELEM_FLT32TODEPTHPIXEL_INPUT
1814 *
1815 * @brief
1816 * Input structure for addrFlt32ToDepthPixel
1817 *
1818 ****************************************************************************************************
1819 */
1820 typedef struct _ELEM_FLT32TODEPTHPIXEL_INPUT
1821 {
1822 UINT_32 size; ///< Size of this structure in bytes
1823
1824 AddrDepthFormat format; ///< Depth buffer format
1825 ADDR_FLT_32 comps[2]; ///< Component values (Z/stencil)
1826 } ELEM_FLT32TODEPTHPIXEL_INPUT;
1827
1828 /**
1829 ****************************************************************************************************
1830 * ELEM_FLT32TODEPTHPIXEL_INPUT
1831 *
1832 * @brief
1833 * Output structure for ElemFlt32ToDepthPixel
1834 *
1835 ****************************************************************************************************
1836 */
1837 typedef struct _ELEM_FLT32TODEPTHPIXEL_OUTPUT
1838 {
1839 UINT_32 size; ///< Size of this structure in bytes
1840
1841 UINT_8* pPixel; ///< Real depth value. Same data type as depth buffer.
1842 /// Client must provide enough storage for this type.
1843 UINT_32 depthBase; ///< Tile base in bits for depth bits
1844 UINT_32 stencilBase; ///< Tile base in bits for stencil bits
1845 UINT_32 depthBits; ///< Bits for depth
1846 UINT_32 stencilBits; ///< Bits for stencil
1847 } ELEM_FLT32TODEPTHPIXEL_OUTPUT;
1848
1849 /**
1850 ****************************************************************************************************
1851 * ElemFlt32ToDepthPixel
1852 *
1853 * @brief
1854 * Convert a FLT_32 value to a depth/stencil pixel value
1855 *
1856 * @return
1857 * Return code
1858 *
1859 ****************************************************************************************************
1860 */
1861 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToDepthPixel(
1862 ADDR_HANDLE hLib,
1863 const ELEM_FLT32TODEPTHPIXEL_INPUT* pIn,
1864 ELEM_FLT32TODEPTHPIXEL_OUTPUT* pOut);
1865
1866 /**
1867 ****************************************************************************************************
1868 * ELEM_FLT32TOCOLORPIXEL_INPUT
1869 *
1870 * @brief
1871 * Input structure for addrFlt32ToColorPixel
1872 *
1873 ****************************************************************************************************
1874 */
1875 typedef struct _ELEM_FLT32TOCOLORPIXEL_INPUT
1876 {
1877 UINT_32 size; ///< Size of this structure in bytes
1878
1879 AddrColorFormat format; ///< Color buffer format
1880 AddrSurfaceNumber surfNum; ///< Surface number
1881 AddrSurfaceSwap surfSwap; ///< Surface swap
1882 ADDR_FLT_32 comps[4]; ///< Component values (r/g/b/a)
1883 } ELEM_FLT32TOCOLORPIXEL_INPUT;
1884
1885 /**
1886 ****************************************************************************************************
1887 * ELEM_FLT32TOCOLORPIXEL_INPUT
1888 *
1889 * @brief
1890 * Output structure for ElemFlt32ToColorPixel
1891 *
1892 ****************************************************************************************************
1893 */
1894 typedef struct _ELEM_FLT32TOCOLORPIXEL_OUTPUT
1895 {
1896 UINT_32 size; ///< Size of this structure in bytes
1897
1898 UINT_8* pPixel; ///< Real color value. Same data type as color buffer.
1899 /// Client must provide enough storage for this type.
1900 } ELEM_FLT32TOCOLORPIXEL_OUTPUT;
1901
1902 /**
1903 ****************************************************************************************************
1904 * ElemFlt32ToColorPixel
1905 *
1906 * @brief
1907 * Convert a FLT_32 value to a red/green/blue/alpha pixel value
1908 *
1909 * @return
1910 * Return code
1911 *
1912 ****************************************************************************************************
1913 */
1914 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToColorPixel(
1915 ADDR_HANDLE hLib,
1916 const ELEM_FLT32TOCOLORPIXEL_INPUT* pIn,
1917 ELEM_FLT32TOCOLORPIXEL_OUTPUT* pOut);
1918
1919 /**
1920 ****************************************************************************************************
1921 * ElemSize
1922 *
1923 * @brief
1924 * Get bits-per-element for specified format
1925 *
1926 * @return
1927 * Bits-per-element of specified format
1928 *
1929 ****************************************************************************************************
1930 */
1931 UINT_32 ADDR_API ElemSize(
1932 ADDR_HANDLE hLib,
1933 AddrFormat format);
1934
1935 /**
1936 ****************************************************************************************************
1937 * ADDR_CONVERT_TILEINFOTOHW_INPUT
1938 *
1939 * @brief
1940 * Input structure for AddrConvertTileInfoToHW
1941 * @note
1942 * When reverse is TRUE, indices are igonred
1943 ****************************************************************************************************
1944 */
1945 typedef struct _ADDR_CONVERT_TILEINFOTOHW_INPUT
1946 {
1947 UINT_32 size; ///< Size of this structure in bytes
1948 BOOL_32 reverse; ///< Convert control flag.
1949 /// FALSE: convert from real value to HW value;
1950 /// TRUE: convert from HW value to real value.
1951
1952 /// r800 and later HWL parameters
1953 ADDR_TILEINFO* pTileInfo; ///< Tile parameters with real value
1954
1955 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it
1956 /// while the global useTileIndex is set to 1
1957 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
1958 ///< README: When tileIndex is not -1, this must be valid
1959 UINT_32 bpp; ///< Bits per pixel
1960 } ADDR_CONVERT_TILEINFOTOHW_INPUT;
1961
1962 /**
1963 ****************************************************************************************************
1964 * ADDR_CONVERT_TILEINFOTOHW_OUTPUT
1965 *
1966 * @brief
1967 * Output structure for AddrConvertTileInfoToHW
1968 ****************************************************************************************************
1969 */
1970 typedef struct _ADDR_CONVERT_TILEINFOTOHW_OUTPUT
1971 {
1972 UINT_32 size; ///< Size of this structure in bytes
1973
1974 /// r800 and later HWL parameters
1975 ADDR_TILEINFO* pTileInfo; ///< Tile parameters with hardware register value
1976
1977 } ADDR_CONVERT_TILEINFOTOHW_OUTPUT;
1978
1979 /**
1980 ****************************************************************************************************
1981 * AddrConvertTileInfoToHW
1982 *
1983 * @brief
1984 * Convert tile info from real value to hardware register value
1985 ****************************************************************************************************
1986 */
1987 ADDR_E_RETURNCODE ADDR_API AddrConvertTileInfoToHW(
1988 ADDR_HANDLE hLib,
1989 const ADDR_CONVERT_TILEINFOTOHW_INPUT* pIn,
1990 ADDR_CONVERT_TILEINFOTOHW_OUTPUT* pOut);
1991
1992 /**
1993 ****************************************************************************************************
1994 * ADDR_CONVERT_TILEINDEX_INPUT
1995 *
1996 * @brief
1997 * Input structure for AddrConvertTileIndex
1998 ****************************************************************************************************
1999 */
2000 typedef struct _ADDR_CONVERT_TILEINDEX_INPUT
2001 {
2002 UINT_32 size; ///< Size of this structure in bytes
2003
2004 INT_32 tileIndex; ///< Tile index
2005 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
2006 UINT_32 bpp; ///< Bits per pixel
2007 BOOL_32 tileInfoHw; ///< Set to TRUE if client wants HW enum, otherwise actual
2008 } ADDR_CONVERT_TILEINDEX_INPUT;
2009
2010 /**
2011 ****************************************************************************************************
2012 * ADDR_CONVERT_TILEINDEX_OUTPUT
2013 *
2014 * @brief
2015 * Output structure for AddrConvertTileIndex
2016 ****************************************************************************************************
2017 */
2018 typedef struct _ADDR_CONVERT_TILEINDEX_OUTPUT
2019 {
2020 UINT_32 size; ///< Size of this structure in bytes
2021
2022 AddrTileMode tileMode; ///< Tile mode
2023 AddrTileType tileType; ///< Tile type
2024 ADDR_TILEINFO* pTileInfo; ///< Tile info
2025
2026 } ADDR_CONVERT_TILEINDEX_OUTPUT;
2027
2028 /**
2029 ****************************************************************************************************
2030 * AddrConvertTileIndex
2031 *
2032 * @brief
2033 * Convert tile index to tile mode/type/info
2034 ****************************************************************************************************
2035 */
2036 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex(
2037 ADDR_HANDLE hLib,
2038 const ADDR_CONVERT_TILEINDEX_INPUT* pIn,
2039 ADDR_CONVERT_TILEINDEX_OUTPUT* pOut);
2040
2041 /**
2042 ****************************************************************************************************
2043 * ADDR_GET_MACROMODEINDEX_INPUT
2044 *
2045 * @brief
2046 * Input structure for AddrGetMacroModeIndex
2047 ****************************************************************************************************
2048 */
2049 typedef struct _ADDR_GET_MACROMODEINDEX_INPUT
2050 {
2051 UINT_32 size; ///< Size of this structure in bytes
2052 ADDR_SURFACE_FLAGS flags; ///< Surface flag
2053 INT_32 tileIndex; ///< Tile index
2054 UINT_32 bpp; ///< Bits per pixel
2055 UINT_32 numFrags; ///< Number of color fragments
2056 } ADDR_GET_MACROMODEINDEX_INPUT;
2057
2058 /**
2059 ****************************************************************************************************
2060 * ADDR_GET_MACROMODEINDEX_OUTPUT
2061 *
2062 * @brief
2063 * Output structure for AddrGetMacroModeIndex
2064 ****************************************************************************************************
2065 */
2066 typedef struct _ADDR_GET_MACROMODEINDEX_OUTPUT
2067 {
2068 UINT_32 size; ///< Size of this structure in bytes
2069 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
2070 } ADDR_GET_MACROMODEINDEX_OUTPUT;
2071
2072 /**
2073 ****************************************************************************************************
2074 * AddrGetMacroModeIndex
2075 *
2076 * @brief
2077 * Get macro mode index based on input parameters
2078 ****************************************************************************************************
2079 */
2080 ADDR_E_RETURNCODE ADDR_API AddrGetMacroModeIndex(
2081 ADDR_HANDLE hLib,
2082 const ADDR_GET_MACROMODEINDEX_INPUT* pIn,
2083 ADDR_GET_MACROMODEINDEX_OUTPUT* pOut);
2084
2085 /**
2086 ****************************************************************************************************
2087 * ADDR_CONVERT_TILEINDEX1_INPUT
2088 *
2089 * @brief
2090 * Input structure for AddrConvertTileIndex1 (without macro mode index)
2091 ****************************************************************************************************
2092 */
2093 typedef struct _ADDR_CONVERT_TILEINDEX1_INPUT
2094 {
2095 UINT_32 size; ///< Size of this structure in bytes
2096
2097 INT_32 tileIndex; ///< Tile index
2098 UINT_32 bpp; ///< Bits per pixel
2099 UINT_32 numSamples; ///< Number of samples
2100 BOOL_32 tileInfoHw; ///< Set to TRUE if client wants HW enum, otherwise actual
2101 } ADDR_CONVERT_TILEINDEX1_INPUT;
2102
2103 /**
2104 ****************************************************************************************************
2105 * AddrConvertTileIndex1
2106 *
2107 * @brief
2108 * Convert tile index to tile mode/type/info
2109 ****************************************************************************************************
2110 */
2111 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex1(
2112 ADDR_HANDLE hLib,
2113 const ADDR_CONVERT_TILEINDEX1_INPUT* pIn,
2114 ADDR_CONVERT_TILEINDEX_OUTPUT* pOut);
2115
2116 /**
2117 ****************************************************************************************************
2118 * ADDR_GET_TILEINDEX_INPUT
2119 *
2120 * @brief
2121 * Input structure for AddrGetTileIndex
2122 ****************************************************************************************************
2123 */
2124 typedef struct _ADDR_GET_TILEINDEX_INPUT
2125 {
2126 UINT_32 size; ///< Size of this structure in bytes
2127
2128 AddrTileMode tileMode; ///< Tile mode
2129 AddrTileType tileType; ///< Tile-type: disp/non-disp/...
2130 ADDR_TILEINFO* pTileInfo; ///< Pointer to tile-info structure, can be NULL for linear/1D
2131 } ADDR_GET_TILEINDEX_INPUT;
2132
2133 /**
2134 ****************************************************************************************************
2135 * ADDR_GET_TILEINDEX_OUTPUT
2136 *
2137 * @brief
2138 * Output structure for AddrGetTileIndex
2139 ****************************************************************************************************
2140 */
2141 typedef struct _ADDR_GET_TILEINDEX_OUTPUT
2142 {
2143 UINT_32 size; ///< Size of this structure in bytes
2144
2145 INT_32 index; ///< index in table
2146 } ADDR_GET_TILEINDEX_OUTPUT;
2147
2148 /**
2149 ****************************************************************************************************
2150 * AddrGetTileIndex
2151 *
2152 * @brief
2153 * Get the tiling mode index in table
2154 ****************************************************************************************************
2155 */
2156 ADDR_E_RETURNCODE ADDR_API AddrGetTileIndex(
2157 ADDR_HANDLE hLib,
2158 const ADDR_GET_TILEINDEX_INPUT* pIn,
2159 ADDR_GET_TILEINDEX_OUTPUT* pOut);
2160
2161 /**
2162 ****************************************************************************************************
2163 * ADDR_PRT_INFO_INPUT
2164 *
2165 * @brief
2166 * Input structure for AddrComputePrtInfo
2167 ****************************************************************************************************
2168 */
2169 typedef struct _ADDR_PRT_INFO_INPUT
2170 {
2171 AddrFormat format; ///< Surface format
2172 UINT_32 baseMipWidth; ///< Base mipmap width
2173 UINT_32 baseMipHeight; ///< Base mipmap height
2174 UINT_32 baseMipDepth; ///< Base mipmap depth
2175 UINT_32 numFrags; ///< Number of fragments,
2176 } ADDR_PRT_INFO_INPUT;
2177
2178 /**
2179 ****************************************************************************************************
2180 * ADDR_PRT_INFO_OUTPUT
2181 *
2182 * @brief
2183 * Input structure for AddrComputePrtInfo
2184 ****************************************************************************************************
2185 */
2186 typedef struct _ADDR_PRT_INFO_OUTPUT
2187 {
2188 UINT_32 prtTileWidth;
2189 UINT_32 prtTileHeight;
2190 } ADDR_PRT_INFO_OUTPUT;
2191
2192 /**
2193 ****************************************************************************************************
2194 * AddrComputePrtInfo
2195 *
2196 * @brief
2197 * Compute prt surface related information
2198 ****************************************************************************************************
2199 */
2200 ADDR_E_RETURNCODE ADDR_API AddrComputePrtInfo(
2201 ADDR_HANDLE hLib,
2202 const ADDR_PRT_INFO_INPUT* pIn,
2203 ADDR_PRT_INFO_OUTPUT* pOut);
2204
2205 ////////////////////////////////////////////////////////////////////////////////////////////////////
2206 // DCC key functions
2207 ////////////////////////////////////////////////////////////////////////////////////////////////////
2208
2209 /**
2210 ****************************************************************************************************
2211 * _ADDR_COMPUTE_DCCINFO_INPUT
2212 *
2213 * @brief
2214 * Input structure of AddrComputeDccInfo
2215 ****************************************************************************************************
2216 */
2217 typedef struct _ADDR_COMPUTE_DCCINFO_INPUT
2218 {
2219 UINT_32 size; ///< Size of this structure in bytes
2220 UINT_32 bpp; ///< BitPP of color surface
2221 UINT_32 numSamples; ///< Sample number of color surface
2222 UINT_64 colorSurfSize; ///< Size of color surface to which dcc key is bound
2223 AddrTileMode tileMode; ///< Tile mode of color surface
2224 ADDR_TILEINFO tileInfo; ///< Tile info of color surface
2225 UINT_32 tileSwizzle; ///< Tile swizzle
2226 INT_32 tileIndex; ///< Tile index of color surface,
2227 ///< MUST be -1 if you don't want to use it
2228 ///< while the global useTileIndex is set to 1
2229 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
2230 ///< README: When tileIndex is not -1, this must be valid
2231 } ADDR_COMPUTE_DCCINFO_INPUT;
2232
2233 /**
2234 ****************************************************************************************************
2235 * ADDR_COMPUTE_DCCINFO_OUTPUT
2236 *
2237 * @brief
2238 * Output structure of AddrComputeDccInfo
2239 ****************************************************************************************************
2240 */
2241 typedef struct _ADDR_COMPUTE_DCCINFO_OUTPUT
2242 {
2243 UINT_32 size; ///< Size of this structure in bytes
2244 UINT_32 dccRamBaseAlign; ///< Base alignment of dcc key
2245 UINT_64 dccRamSize; ///< Size of dcc key
2246 UINT_64 dccFastClearSize; ///< Size of dcc key portion that can be fast cleared
2247 BOOL_32 subLvlCompressible; ///< Whether sub resource is compressiable
2248 BOOL_32 dccRamSizeAligned; ///< Whether the dcc key size is aligned
2249 } ADDR_COMPUTE_DCCINFO_OUTPUT;
2250
2251 /**
2252 ****************************************************************************************************
2253 * AddrComputeDccInfo
2254 *
2255 * @brief
2256 * Compute DCC key size, base alignment
2257 * info
2258 ****************************************************************************************************
2259 */
2260 ADDR_E_RETURNCODE ADDR_API AddrComputeDccInfo(
2261 ADDR_HANDLE hLib,
2262 const ADDR_COMPUTE_DCCINFO_INPUT* pIn,
2263 ADDR_COMPUTE_DCCINFO_OUTPUT* pOut);
2264
2265 /**
2266 ****************************************************************************************************
2267 * ADDR_GET_MAX_ALIGNMENTS_OUTPUT
2268 *
2269 * @brief
2270 * Output structure of AddrGetMaxAlignments
2271 ****************************************************************************************************
2272 */
2273 typedef struct _ADDR_GET_MAX_ALIGNMENTS_OUTPUT
2274 {
2275 UINT_32 size; ///< Size of this structure in bytes
2276 UINT_32 baseAlign; ///< Maximum base alignment in bytes
2277 } ADDR_GET_MAX_ALIGNMENTS_OUTPUT;
2278
2279 /**
2280 ****************************************************************************************************
2281 * AddrGetMaxAlignments
2282 *
2283 * @brief
2284 * Gets maximnum alignments
2285 ****************************************************************************************************
2286 */
2287 ADDR_E_RETURNCODE ADDR_API AddrGetMaxAlignments(
2288 ADDR_HANDLE hLib,
2289 ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut);
2290
2291 /**
2292 ****************************************************************************************************
2293 * AddrGetMaxMetaAlignments
2294 *
2295 * @brief
2296 * Gets maximnum alignments for metadata
2297 ****************************************************************************************************
2298 */
2299 ADDR_E_RETURNCODE ADDR_API AddrGetMaxMetaAlignments(
2300 ADDR_HANDLE hLib,
2301 ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut);
2302
2303 /**
2304 ****************************************************************************************************
2305 * Address library interface version 2
2306 * available from Gfx9 hardware
2307 ****************************************************************************************************
2308 * Addr2ComputeSurfaceInfo()
2309 * Addr2ComputeSurfaceAddrFromCoord()
2310 * Addr2ComputeSurfaceCoordFromAddr()
2311
2312 * Addr2ComputeHtileInfo()
2313 * Addr2ComputeHtileAddrFromCoord()
2314 * Addr2ComputeHtileCoordFromAddr()
2315 *
2316 * Addr2ComputeCmaskInfo()
2317 * Addr2ComputeCmaskAddrFromCoord()
2318 * Addr2ComputeCmaskCoordFromAddr()
2319 *
2320 * Addr2ComputeFmaskInfo()
2321 * Addr2ComputeFmaskAddrFromCoord()
2322 * Addr2ComputeFmaskCoordFromAddr()
2323 *
2324 * Addr2ComputeDccInfo()
2325 *
2326 **/
2327
2328 ////////////////////////////////////////////////////////////////////////////////////////////////////
2329 // Surface functions for Gfx9
2330 ////////////////////////////////////////////////////////////////////////////////////////////////////
2331
2332 /**
2333 ****************************************************************************************************
2334 * ADDR2_SURFACE_FLAGS
2335 *
2336 * @brief
2337 * Surface flags
2338 ****************************************************************************************************
2339 */
2340 typedef union _ADDR2_SURFACE_FLAGS
2341 {
2342 struct
2343 {
2344 UINT_32 color : 1; ///< This resource is a color buffer, can be used with RTV
2345 UINT_32 depth : 1; ///< Thie resource is a depth buffer, can be used with DSV
2346 UINT_32 stencil : 1; ///< Thie resource is a stencil buffer, can be used with DSV
2347 UINT_32 fmask : 1; ///< This is an fmask surface
2348 UINT_32 overlay : 1; ///< This is an overlay surface
2349 UINT_32 display : 1; ///< This resource is displable, can be used with DRV
2350 UINT_32 prt : 1; ///< This is a partially resident texture
2351 UINT_32 qbStereo : 1; ///< This is a quad buffer stereo surface
2352 UINT_32 interleaved : 1; ///< Special flag for interleaved YUV surface padding
2353 UINT_32 texture : 1; ///< This resource can be used with SRV
2354 UINT_32 unordered : 1; ///< This resource can be used with UAV
2355 UINT_32 rotated : 1; ///< This resource is rotated and displable
2356 UINT_32 needEquation : 1; ///< This resource needs equation to be generated if possible
2357 UINT_32 opt4space : 1; ///< This resource should be optimized for space
2358 UINT_32 minimizeAlign : 1; ///< This resource should use minimum alignment
2359 UINT_32 noMetadata : 1; ///< This resource has no metadata
2360 UINT_32 metaRbUnaligned : 1; ///< This resource has rb unaligned metadata
2361 UINT_32 metaPipeUnaligned : 1; ///< This resource has pipe unaligned metadata
2362 UINT_32 view3dAs2dArray : 1; ///< This resource is a 3D resource viewed as 2D array
2363 UINT_32 reserved : 13; ///< Reserved bits
2364 };
2365
2366 UINT_32 value;
2367 } ADDR2_SURFACE_FLAGS;
2368
2369 /**
2370 ****************************************************************************************************
2371 * ADDR2_COMPUTE_SURFACE_INFO_INPUT
2372 *
2373 * @brief
2374 * Input structure for Addr2ComputeSurfaceInfo
2375 ****************************************************************************************************
2376 */
2377 typedef struct _ADDR2_COMPUTE_SURFACE_INFO_INPUT
2378 {
2379 UINT_32 size; ///< Size of this structure in bytes
2380
2381 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
2382 AddrSwizzleMode swizzleMode; ///< Swizzle Mode for Gfx9
2383 AddrResourceType resourceType; ///< Surface type
2384 AddrFormat format; ///< Surface format
2385 UINT_32 bpp; ///< bits per pixel
2386 UINT_32 width; ///< Width (of mip0), in pixels
2387 UINT_32 height; ///< Height (of mip0), in pixels
2388 UINT_32 numSlices; ///< Number surface slice/depth (of mip0),
2389 UINT_32 numMipLevels; ///< Total mipmap levels.
2390 UINT_32 numSamples; ///< Number of samples
2391 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
2392 /// number of samples for normal AA; Set it to the
2393 /// number of fragments for EQAA
2394 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats)
2395 UINT_32 sliceAlign; ///< Required slice size in bytes
2396 } ADDR2_COMPUTE_SURFACE_INFO_INPUT;
2397
2398 /**
2399 ****************************************************************************************************
2400 * ADDR2_MIP_INFO
2401 *
2402 * @brief
2403 * Structure that contains information for mip level
2404 *
2405 ****************************************************************************************************
2406 */
2407 typedef struct _ADDR2_MIP_INFO
2408 {
2409 UINT_32 pitch; ///< Pitch in elements
2410 UINT_32 height; ///< Padded height in elements
2411 UINT_32 depth; ///< Padded depth
2412 UINT_32 pixelPitch; ///< Pitch in pixels
2413 UINT_32 pixelHeight; ///< Padded height in pixels
2414 UINT_32 equationIndex; ///< Equation index in the equation table
2415 UINT_64 offset; ///< Offset in bytes from mip base, should only be used
2416 ///< to setup vam surface descriptor, can't be used
2417 ///< to setup swizzle pattern
2418 UINT_64 macroBlockOffset; ///< macro block offset in bytes from mip base
2419 UINT_32 mipTailOffset; ///< mip tail offset in bytes
2420 UINT_32 mipTailCoordX; ///< mip tail coord x
2421 UINT_32 mipTailCoordY; ///< mip tail coord y
2422 UINT_32 mipTailCoordZ; ///< mip tail coord z
2423 } ADDR2_MIP_INFO;
2424
2425 /**
2426 ****************************************************************************************************
2427 * ADDR2_COMPUTE_SURFACE_INFO_OUTPUT
2428 *
2429 * @brief
2430 * Output structure for Addr2ComputeSurfInfo
2431 * @note
2432 Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch
2433 Pixel: Original pixel
2434 ****************************************************************************************************
2435 */
2436 typedef struct _ADDR2_COMPUTE_SURFACE_INFO_OUTPUT
2437 {
2438 UINT_32 size; ///< Size of this structure in bytes
2439
2440 UINT_32 pitch; ///< Pitch in elements (blocks for compressed formats)
2441 UINT_32 height; ///< Padded height (of mip0) in elements
2442 UINT_32 numSlices; ///< Padded depth for 3d resource
2443 ///< or padded number of slices for 2d array resource
2444 UINT_32 mipChainPitch; ///< Pitch (of total mip chain) in elements
2445 UINT_32 mipChainHeight; ///< Padded height (of total mip chain) in elements
2446 UINT_32 mipChainSlice; ///< Padded depth (of total mip chain)
2447 UINT_64 sliceSize; ///< Slice (total mip chain) size in bytes
2448 UINT_64 surfSize; ///< Surface (total mip chain) size in bytes
2449 UINT_32 baseAlign; ///< Base address alignment
2450 UINT_32 bpp; ///< Bits per elements
2451 /// (e.g. blocks for BCn, 1/3 for 96bit)
2452 UINT_32 pixelMipChainPitch; ///< Mip chain pitch in original pixels
2453 UINT_32 pixelMipChainHeight; ///< Mip chain height in original pixels
2454 UINT_32 pixelPitch; ///< Pitch in original pixels
2455 UINT_32 pixelHeight; ///< Height in original pixels
2456 UINT_32 pixelBits; ///< Original bits per pixel, passed from input
2457
2458 UINT_32 blockWidth; ///< Width in element inside one block
2459 UINT_32 blockHeight; ///< Height in element inside one block
2460 UINT_32 blockSlices; ///< Slice number inside one block
2461 ///< Prt tile is one block, its width/height/slice
2462 ///< equals to blcok width/height/slice
2463
2464 BOOL_32 epitchIsHeight; ///< Whether to use height to program epitch register
2465 /// Stereo info
2466 ADDR_QBSTEREOINFO* pStereoInfo; ///< Stereo info, needed if qbStereo flag is TRUE
2467 /// Mip info
2468 ADDR2_MIP_INFO* pMipInfo; ///< Pointer to mip information array
2469 /// if it is not NULL, the array is assumed to
2470 /// contain numMipLevels entries
2471
2472 UINT_32 equationIndex; ///< Equation index in the equation table of mip0
2473 BOOL_32 mipChainInTail; ///< If whole mipchain falls into mip tail block
2474 UINT_32 firstMipIdInTail; ///< The id of first mip in tail, if there is no mip
2475 /// in tail, it will be set to number of mip levels
2476 } ADDR2_COMPUTE_SURFACE_INFO_OUTPUT;
2477
2478 /**
2479 ****************************************************************************************************
2480 * Addr2ComputeSurfaceInfo
2481 *
2482 * @brief
2483 * Compute surface width/height/slices/alignments and suitable tiling mode
2484 ****************************************************************************************************
2485 */
2486 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceInfo(
2487 ADDR_HANDLE hLib,
2488 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn,
2489 ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut);
2490
2491 /**
2492 ****************************************************************************************************
2493 * ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
2494 *
2495 * @brief
2496 * Input structure for Addr2ComputeSurfaceAddrFromCoord
2497 ****************************************************************************************************
2498 */
2499 typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
2500 {
2501 UINT_32 size; ///< Size of this structure in bytes
2502
2503 UINT_32 x; ///< X coordinate
2504 UINT_32 y; ///< Y coordinate
2505 UINT_32 slice; ///< Slice index
2506 UINT_32 sample; ///< Sample index, use fragment index for EQAA
2507 UINT_32 mipId; ///< the mip ID in mip chain
2508
2509 AddrSwizzleMode swizzleMode; ///< Swizzle mode for Gfx9
2510 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
2511 AddrResourceType resourceType; ///< Surface type
2512 UINT_32 bpp; ///< Bits per pixel
2513 UINT_32 unalignedWidth; ///< Surface original width (of mip0)
2514 UINT_32 unalignedHeight; ///< Surface original height (of mip0)
2515 UINT_32 numSlices; ///< Surface original slices (of mip0)
2516 UINT_32 numMipLevels; ///< Total mipmap levels
2517 UINT_32 numSamples; ///< Number of samples
2518 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
2519 /// number of samples for normal AA; Set it to the
2520 /// number of fragments for EQAA
2521
2522 UINT_32 pipeBankXor; ///< Combined swizzle used to do bank/pipe rotation
2523 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats)
2524 } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT;
2525
2526 /**
2527 ****************************************************************************************************
2528 * ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
2529 *
2530 * @brief
2531 * Output structure for Addr2ComputeSurfaceAddrFromCoord
2532 ****************************************************************************************************
2533 */
2534 typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
2535 {
2536 UINT_32 size; ///< Size of this structure in bytes
2537
2538 UINT_64 addr; ///< Byte address
2539 UINT_32 bitPosition; ///< Bit position within surfaceAddr, 0-7.
2540 /// For surface bpp < 8, e.g. FMT_1.
2541 UINT_32 prtBlockIndex; ///< Index of a PRT tile (64K block)
2542 } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT;
2543
2544 /**
2545 ****************************************************************************************************
2546 * Addr2ComputeSurfaceAddrFromCoord
2547 *
2548 * @brief
2549 * Compute surface address from a given coordinate.
2550 ****************************************************************************************************
2551 */
2552 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceAddrFromCoord(
2553 ADDR_HANDLE hLib,
2554 const ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,
2555 ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut);
2556
2557 /**
2558 ****************************************************************************************************
2559 * ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT
2560 *
2561 * @brief
2562 * Input structure for Addr2ComputeSurfaceCoordFromAddr
2563 ****************************************************************************************************
2564 */
2565 typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT
2566 {
2567 UINT_32 size; ///< Size of this structure in bytes
2568
2569 UINT_64 addr; ///< Address in bytes
2570 UINT_32 bitPosition; ///< Bit position in addr. 0-7. for surface bpp < 8,
2571 /// e.g. FMT_1;
2572
2573 AddrSwizzleMode swizzleMode; ///< Swizzle mode for Gfx9
2574 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
2575 AddrResourceType resourceType; ///< Surface type
2576 UINT_32 bpp; ///< Bits per pixel
2577 UINT_32 unalignedWidth; ///< Surface original width (of mip0)
2578 UINT_32 unalignedHeight; ///< Surface original height (of mip0)
2579 UINT_32 numSlices; ///< Surface original slices (of mip0)
2580 UINT_32 numMipLevels; ///< Total mipmap levels.
2581 UINT_32 numSamples; ///< Number of samples
2582 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
2583 /// number of samples for normal AA; Set it to the
2584 /// number of fragments for EQAA
2585
2586 UINT_32 pipeBankXor; ///< Combined swizzle used to do bank/pipe rotation
2587 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats)
2588 } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT;
2589
2590 /**
2591 ****************************************************************************************************
2592 * ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
2593 *
2594 * @brief
2595 * Output structure for Addr2ComputeSurfaceCoordFromAddr
2596 ****************************************************************************************************
2597 */
2598 typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
2599 {
2600 UINT_32 size; ///< Size of this structure in bytes
2601
2602 UINT_32 x; ///< X coordinate
2603 UINT_32 y; ///< Y coordinate
2604 UINT_32 slice; ///< Index of slices
2605 UINT_32 sample; ///< Index of samples, means fragment index for EQAA
2606 UINT_32 mipId; ///< mipmap level id
2607 } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT;
2608
2609 /**
2610 ****************************************************************************************************
2611 * Addr2ComputeSurfaceCoordFromAddr
2612 *
2613 * @brief
2614 * Compute coordinate from a given surface address
2615 ****************************************************************************************************
2616 */
2617 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceCoordFromAddr(
2618 ADDR_HANDLE hLib,
2619 const ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,
2620 ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut);
2621
2622 ////////////////////////////////////////////////////////////////////////////////////////////////////
2623 // HTile functions for Gfx9
2624 ////////////////////////////////////////////////////////////////////////////////////////////////////
2625
2626 /**
2627 ****************************************************************************************************
2628 * ADDR2_META_FLAGS
2629 *
2630 * @brief
2631 * Metadata flags
2632 ****************************************************************************************************
2633 */
2634 typedef union _ADDR2_META_FLAGS
2635 {
2636 struct
2637 {
2638 UINT_32 pipeAligned : 1; ///< if Metadata being pipe aligned
2639 UINT_32 rbAligned : 1; ///< if Metadata being RB aligned
2640 UINT_32 linear : 1; ///< if Metadata linear, GFX9 does not suppord this!
2641 UINT_32 reserved : 29; ///< Reserved bits
2642 };
2643
2644 UINT_32 value;
2645 } ADDR2_META_FLAGS;
2646
2647 /**
2648 ****************************************************************************************************
2649 * ADDR2_META_MIP_INFO
2650 *
2651 * @brief
2652 * Structure to store per mip metadata information
2653 ****************************************************************************************************
2654 */
2655 typedef struct _ADDR2_META_MIP_INFO
2656 {
2657 BOOL_32 inMiptail;
2658 union
2659 {
2660 struct
2661 {
2662 UINT_32 startX;
2663 UINT_32 startY;
2664 UINT_32 startZ;
2665 UINT_32 width;
2666 UINT_32 height;
2667 UINT_32 depth;
2668 };
2669
2670 struct
2671 {
2672 UINT_32 offset; ///< Metadata offset within one slice,
2673 /// the thickness of a slice is meta block depth.
2674 UINT_32 sliceSize; ///< Metadata size within one slice,
2675 /// the thickness of a slice is meta block depth.
2676 };
2677 };
2678 } ADDR2_META_MIP_INFO;
2679
2680 /**
2681 ****************************************************************************************************
2682 * ADDR2_COMPUTE_HTILE_INFO_INPUT
2683 *
2684 * @brief
2685 * Input structure of Addr2ComputeHtileInfo
2686 ****************************************************************************************************
2687 */
2688 typedef struct _ADDR2_COMPUTE_HTILE_INFO_INPUT
2689 {
2690 UINT_32 size; ///< Size of this structure in bytes
2691
2692 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags
2693 ADDR2_SURFACE_FLAGS depthFlags; ///< Depth surface flags
2694 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode
2695 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0)
2696 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0)
2697 UINT_32 numSlices; ///< Number of slices of depth surface (of mip0)
2698 UINT_32 numMipLevels; ///< Total mipmap levels of color surface
2699 UINT_32 firstMipIdInTail; /// Id of the first mip in tail,
2700 /// if no mip is in tail, it should be set to
2701 /// number of mip levels
2702 } ADDR2_COMPUTE_HTILE_INFO_INPUT;
2703
2704 /**
2705 ****************************************************************************************************
2706 * ADDR2_COMPUTE_HTILE_INFO_OUTPUT
2707 *
2708 * @brief
2709 * Output structure of Addr2ComputeHtileInfo
2710 ****************************************************************************************************
2711 */
2712 typedef struct _ADDR2_COMPUTE_HTILE_INFO_OUTPUT
2713 {
2714 UINT_32 size; ///< Size of this structure in bytes
2715
2716 UINT_32 pitch; ///< Pitch in pixels of depth buffer represented in this
2717 /// HTile buffer. This might be larger than original depth
2718 /// buffer pitch when called with an unaligned pitch.
2719 UINT_32 height; ///< Height in pixels, as above
2720 UINT_32 baseAlign; ///< Base alignment
2721 UINT_32 sliceSize; ///< Slice size, in bytes.
2722 UINT_32 htileBytes; ///< Size of HTILE buffer, in bytes
2723 UINT_32 metaBlkWidth; ///< Meta block width
2724 UINT_32 metaBlkHeight; ///< Meta block height
2725 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice
2726
2727 ADDR2_META_MIP_INFO* pMipInfo; ///< HTILE mip information
2728 } ADDR2_COMPUTE_HTILE_INFO_OUTPUT;
2729
2730 /**
2731 ****************************************************************************************************
2732 * Addr2ComputeHtileInfo
2733 *
2734 * @brief
2735 * Compute Htile pitch, height, base alignment and size in bytes
2736 ****************************************************************************************************
2737 */
2738 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileInfo(
2739 ADDR_HANDLE hLib,
2740 const ADDR2_COMPUTE_HTILE_INFO_INPUT* pIn,
2741 ADDR2_COMPUTE_HTILE_INFO_OUTPUT* pOut);
2742
2743 /**
2744 ****************************************************************************************************
2745 * ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
2746 *
2747 * @brief
2748 * Input structure for Addr2ComputeHtileAddrFromCoord
2749 ****************************************************************************************************
2750 */
2751 typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
2752 {
2753 UINT_32 size; ///< Size of this structure in bytes
2754
2755 UINT_32 x; ///< X coordinate
2756 UINT_32 y; ///< Y coordinate
2757 UINT_32 slice; ///< Index of slices
2758 UINT_32 mipId; ///< mipmap level id
2759
2760 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags
2761 ADDR2_SURFACE_FLAGS depthflags; ///< Depth surface flags
2762 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode
2763 UINT_32 bpp; ///< Depth surface bits per pixel
2764 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0)
2765 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0)
2766 UINT_32 numSlices; ///< Depth surface original depth (of mip0)
2767 UINT_32 numMipLevels; ///< Depth surface total mipmap levels
2768 UINT_32 numSamples; ///< Depth surface number of samples
2769 UINT_32 pipeXor; ///< Pipe xor setting
2770 } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT;
2771
2772 /**
2773 ****************************************************************************************************
2774 * ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
2775 *
2776 * @brief
2777 * Output structure for Addr2ComputeHtileAddrFromCoord
2778 ****************************************************************************************************
2779 */
2780 typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
2781 {
2782 UINT_32 size; ///< Size of this structure in bytes
2783
2784 UINT_64 addr; ///< Address in bytes
2785 } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT;
2786
2787 /**
2788 ****************************************************************************************************
2789 * Addr2ComputeHtileAddrFromCoord
2790 *
2791 * @brief
2792 * Compute Htile address according to coordinates (of depth buffer)
2793 ****************************************************************************************************
2794 */
2795 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileAddrFromCoord(
2796 ADDR_HANDLE hLib,
2797 const ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn,
2798 ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut);
2799
2800 /**
2801 ****************************************************************************************************
2802 * ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT
2803 *
2804 * @brief
2805 * Input structure for Addr2ComputeHtileCoordFromAddr
2806 ****************************************************************************************************
2807 */
2808 typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT
2809 {
2810 UINT_32 size; ///< Size of this structure in bytes
2811
2812 UINT_64 addr; ///< Address
2813
2814 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags
2815 ADDR2_SURFACE_FLAGS depthFlags; ///< Depth surface flags
2816 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode
2817 UINT_32 bpp; ///< Depth surface bits per pixel
2818 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0)
2819 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0)
2820 UINT_32 numSlices; ///< Depth surface original depth (of mip0)
2821 UINT_32 numMipLevels; ///< Depth surface total mipmap levels
2822 UINT_32 numSamples; ///< Depth surface number of samples
2823 UINT_32 pipeXor; ///< Pipe xor setting
2824 } ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT;
2825
2826 /**
2827 ****************************************************************************************************
2828 * ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
2829 *
2830 * @brief
2831 * Output structure for Addr2ComputeHtileCoordFromAddr
2832 ****************************************************************************************************
2833 */
2834 typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
2835 {
2836 UINT_32 size; ///< Size of this structure in bytes
2837
2838 UINT_32 x; ///< X coordinate
2839 UINT_32 y; ///< Y coordinate
2840 UINT_32 slice; ///< Index of slices
2841 UINT_32 mipId; ///< mipmap level id
2842 } ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT;
2843
2844 /**
2845 ****************************************************************************************************
2846 * Addr2ComputeHtileCoordFromAddr
2847 *
2848 * @brief
2849 * Compute coordinates within depth buffer (1st pixel of a micro tile) according to
2850 * Htile address
2851 ****************************************************************************************************
2852 */
2853 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileCoordFromAddr(
2854 ADDR_HANDLE hLib,
2855 const ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn,
2856 ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut);
2857
2858 ////////////////////////////////////////////////////////////////////////////////////////////////////
2859 // C-mask functions for Gfx9
2860 ////////////////////////////////////////////////////////////////////////////////////////////////////
2861
2862 /**
2863 ****************************************************************************************************
2864 * ADDR2_COMPUTE_CMASK_INFO_INPUT
2865 *
2866 * @brief
2867 * Input structure of Addr2ComputeCmaskInfo
2868 ****************************************************************************************************
2869 */
2870 typedef struct _ADDR2_COMPUTE_CMASKINFO_INPUT
2871 {
2872 UINT_32 size; ///< Size of this structure in bytes
2873
2874 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags
2875 AddrResourceType resourceType; ///< Color surface type
2876 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
2877 UINT_32 unalignedWidth; ///< Color surface original width
2878 UINT_32 unalignedHeight; ///< Color surface original height
2879 UINT_32 numSlices; ///< Number of slices of color buffer
2880 UINT_32 numMipLevels; ///< Number of mip levels
2881 UINT_32 firstMipIdInTail; ///< The id of first mip in tail, if no mip is in tail,
2882 /// it should be number of mip levels
2883 } ADDR2_COMPUTE_CMASK_INFO_INPUT;
2884
2885 /**
2886 ****************************************************************************************************
2887 * ADDR2_COMPUTE_CMASK_INFO_OUTPUT
2888 *
2889 * @brief
2890 * Output structure of Addr2ComputeCmaskInfo
2891 ****************************************************************************************************
2892 */
2893 typedef struct _ADDR2_COMPUTE_CMASK_INFO_OUTPUT
2894 {
2895 UINT_32 size; ///< Size of this structure in bytes
2896
2897 UINT_32 pitch; ///< Pitch in pixels of color buffer which
2898 /// this Cmask matches. The size might be larger than
2899 /// original color buffer pitch when called with
2900 /// an unaligned pitch.
2901 UINT_32 height; ///< Height in pixels, as above
2902 UINT_32 baseAlign; ///< Base alignment
2903 UINT_32 sliceSize; ///< Slice size, in bytes.
2904 UINT_32 cmaskBytes; ///< Size in bytes of CMask buffer
2905 UINT_32 metaBlkWidth; ///< Meta block width
2906 UINT_32 metaBlkHeight; ///< Meta block height
2907
2908 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice
2909
2910 ADDR2_META_MIP_INFO* pMipInfo; ///< CMASK mip information
2911 } ADDR2_COMPUTE_CMASK_INFO_OUTPUT;
2912
2913 /**
2914 ****************************************************************************************************
2915 * Addr2ComputeCmaskInfo
2916 *
2917 * @brief
2918 * Compute Cmask pitch, height, base alignment and size in bytes from color buffer
2919 * info
2920 ****************************************************************************************************
2921 */
2922 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskInfo(
2923 ADDR_HANDLE hLib,
2924 const ADDR2_COMPUTE_CMASK_INFO_INPUT* pIn,
2925 ADDR2_COMPUTE_CMASK_INFO_OUTPUT* pOut);
2926
2927 /**
2928 ****************************************************************************************************
2929 * ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
2930 *
2931 * @brief
2932 * Input structure for Addr2ComputeCmaskAddrFromCoord
2933 *
2934 ****************************************************************************************************
2935 */
2936 typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
2937 {
2938 UINT_32 size; ///< Size of this structure in bytes
2939
2940 UINT_32 x; ///< X coordinate
2941 UINT_32 y; ///< Y coordinate
2942 UINT_32 slice; ///< Index of slices
2943
2944 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags
2945 AddrResourceType resourceType; ///< Color surface type
2946 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
2947
2948 UINT_32 unalignedWidth; ///< Color surface original width (of mip0)
2949 UINT_32 unalignedHeight; ///< Color surface original height (of mip0)
2950 UINT_32 numSlices; ///< Color surface original slices (of mip0)
2951
2952 UINT_32 numSamples; ///< Color surfae sample number
2953 UINT_32 numFrags; ///< Color surface fragment number
2954
2955 UINT_32 pipeXor; ///< pipe Xor setting
2956 } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT;
2957
2958 /**
2959 ****************************************************************************************************
2960 * ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
2961 *
2962 * @brief
2963 * Output structure for Addr2ComputeCmaskAddrFromCoord
2964 ****************************************************************************************************
2965 */
2966 typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
2967 {
2968 UINT_32 size; ///< Size of this structure in bytes
2969
2970 UINT_64 addr; ///< CMASK address in bytes
2971 UINT_32 bitPosition; ///< Bit position within addr, 0 or 4
2972 } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT;
2973
2974 /**
2975 ****************************************************************************************************
2976 * Addr2ComputeCmaskAddrFromCoord
2977 *
2978 * @brief
2979 * Compute Cmask address according to coordinates (of MSAA color buffer)
2980 ****************************************************************************************************
2981 */
2982 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskAddrFromCoord(
2983 ADDR_HANDLE hLib,
2984 const ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn,
2985 ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut);
2986
2987 /**
2988 ****************************************************************************************************
2989 * ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT
2990 *
2991 * @brief
2992 * Input structure for Addr2ComputeCmaskCoordFromAddr
2993 ****************************************************************************************************
2994 */
2995 typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT
2996 {
2997 UINT_32 size; ///< Size of this structure in bytes
2998
2999 UINT_64 addr; ///< CMASK address in bytes
3000 UINT_32 bitPosition; ///< Bit position within addr, 0 or 4
3001
3002 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags
3003 AddrResourceType resourceType; ///< Color surface type
3004 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3005
3006 UINT_32 unalignedWidth; ///< Color surface original width (of mip0)
3007 UINT_32 unalignedHeight; ///< Color surface original height (of mip0)
3008 UINT_32 numSlices; ///< Color surface original slices (of mip0)
3009 UINT_32 numMipLevels; ///< Color surface total mipmap levels.
3010 } ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT;
3011
3012 /**
3013 ****************************************************************************************************
3014 * ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
3015 *
3016 * @brief
3017 * Output structure for Addr2ComputeCmaskCoordFromAddr
3018 ****************************************************************************************************
3019 */
3020 typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
3021 {
3022 UINT_32 size; ///< Size of this structure in bytes
3023
3024 UINT_32 x; ///< X coordinate
3025 UINT_32 y; ///< Y coordinate
3026 UINT_32 slice; ///< Index of slices
3027 UINT_32 mipId; ///< mipmap level id
3028 } ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT;
3029
3030 /**
3031 ****************************************************************************************************
3032 * Addr2ComputeCmaskCoordFromAddr
3033 *
3034 * @brief
3035 * Compute coordinates within color buffer (1st pixel of a micro tile) according to
3036 * Cmask address
3037 ****************************************************************************************************
3038 */
3039 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskCoordFromAddr(
3040 ADDR_HANDLE hLib,
3041 const ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT* pIn,
3042 ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT* pOut);
3043
3044 ////////////////////////////////////////////////////////////////////////////////////////////////////
3045 // F-mask functions for Gfx9
3046 ////////////////////////////////////////////////////////////////////////////////////////////////////
3047
3048 /**
3049 ****************************************************************************************************
3050 * ADDR2_FMASK_FLAGS
3051 *
3052 * @brief
3053 * FMASK flags
3054 ****************************************************************************************************
3055 */
3056 typedef union _ADDR2_FMASK_FLAGS
3057 {
3058 struct
3059 {
3060 UINT_32 resolved : 1; ///< TRUE if this is a resolved fmask, used by H/W clients
3061 /// by H/W clients. S/W should always set it to FALSE.
3062 UINT_32 reserved : 31; ///< Reserved for future use.
3063 };
3064
3065 UINT_32 value;
3066 } ADDR2_FMASK_FLAGS;
3067
3068 /**
3069 ****************************************************************************************************
3070 * ADDR2_COMPUTE_FMASK_INFO_INPUT
3071 *
3072 * @brief
3073 * Input structure for Addr2ComputeFmaskInfo
3074 ****************************************************************************************************
3075 */
3076 typedef struct _ADDR2_COMPUTE_FMASK_INFO_INPUT
3077 {
3078 UINT_32 size; ///< Size of this structure in bytes
3079
3080 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3081 UINT_32 unalignedWidth; ///< Color surface original width
3082 UINT_32 unalignedHeight; ///< Color surface original height
3083 UINT_32 numSlices; ///< Number of slices/depth
3084 UINT_32 numSamples; ///< Number of samples
3085 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3086 /// number of samples for normal AA; Set it to the
3087 /// number of fragments for EQAA
3088 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags
3089 } ADDR2_COMPUTE_FMASK_INFO_INPUT;
3090
3091 /**
3092 ****************************************************************************************************
3093 * ADDR2_COMPUTE_FMASK_INFO_OUTPUT
3094 *
3095 * @brief
3096 * Output structure for Addr2ComputeFmaskInfo
3097 ****************************************************************************************************
3098 */
3099 typedef struct _ADDR2_COMPUTE_FMASK_INFO_OUTPUT
3100 {
3101 UINT_32 size; ///< Size of this structure in bytes
3102
3103 UINT_32 pitch; ///< Pitch of fmask in pixels
3104 UINT_32 height; ///< Height of fmask in pixels
3105 UINT_32 baseAlign; ///< Base alignment
3106 UINT_32 numSlices; ///< Slices of fmask
3107 UINT_32 fmaskBytes; ///< Size of fmask in bytes
3108 UINT_32 bpp; ///< Bits per pixel of FMASK is: number of bit planes
3109 UINT_32 numSamples; ///< Number of samples
3110 UINT_32 sliceSize; ///< Size of slice in bytes
3111 } ADDR2_COMPUTE_FMASK_INFO_OUTPUT;
3112
3113 /**
3114 ****************************************************************************************************
3115 * Addr2ComputeFmaskInfo
3116 *
3117 * @brief
3118 * Compute Fmask pitch/height/slices/alignments and size in bytes
3119 ****************************************************************************************************
3120 */
3121 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskInfo(
3122 ADDR_HANDLE hLib,
3123 const ADDR2_COMPUTE_FMASK_INFO_INPUT* pIn,
3124 ADDR2_COMPUTE_FMASK_INFO_OUTPUT* pOut);
3125
3126 /**
3127 ****************************************************************************************************
3128 * ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
3129 *
3130 * @brief
3131 * Input structure for Addr2ComputeFmaskAddrFromCoord
3132 ****************************************************************************************************
3133 */
3134 typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
3135 {
3136 UINT_32 size; ///< Size of this structure in bytes
3137
3138 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3139 UINT_32 x; ///< X coordinate
3140 UINT_32 y; ///< Y coordinate
3141 UINT_32 slice; ///< Slice index
3142 UINT_32 sample; ///< Sample index (fragment index for EQAA)
3143 UINT_32 plane; ///< Plane number
3144
3145 UINT_32 unalignedWidth; ///< Color surface original width
3146 UINT_32 unalignedHeight; ///< Color surface original height
3147 UINT_32 numSamples; ///< Number of samples
3148 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3149 /// number of samples for normal AA; Set it to the
3150 /// number of fragments for EQAA
3151 UINT_32 tileSwizzle; ///< Combined swizzle used to do bank/pipe rotation
3152
3153 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags
3154 } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT;
3155
3156 /**
3157 ****************************************************************************************************
3158 * ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
3159 *
3160 * @brief
3161 * Output structure for Addr2ComputeFmaskAddrFromCoord
3162 ****************************************************************************************************
3163 */
3164 typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
3165 {
3166 UINT_32 size; ///< Size of this structure in bytes
3167
3168 UINT_64 addr; ///< Fmask address
3169 UINT_32 bitPosition; ///< Bit position within fmaskAddr, 0-7.
3170 } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT;
3171
3172 /**
3173 ****************************************************************************************************
3174 * Addr2ComputeFmaskAddrFromCoord
3175 *
3176 * @brief
3177 * Compute Fmask address according to coordinates (x,y,slice,sample,plane)
3178 ****************************************************************************************************
3179 */
3180 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskAddrFromCoord(
3181 ADDR_HANDLE hLib,
3182 const ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn,
3183 ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut);
3184
3185 /**
3186 ****************************************************************************************************
3187 * ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT
3188 *
3189 * @brief
3190 * Input structure for Addr2ComputeFmaskCoordFromAddr
3191 ****************************************************************************************************
3192 */
3193 typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT
3194 {
3195 UINT_32 size; ///< Size of this structure in bytes
3196
3197 UINT_64 addr; ///< Address
3198 UINT_32 bitPosition; ///< Bit position within addr, 0-7.
3199 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode
3200
3201 UINT_32 unalignedWidth; ///< Color surface original width
3202 UINT_32 unalignedHeight; ///< Color surface original height
3203 UINT_32 numSamples; ///< Number of samples
3204 UINT_32 numFrags; ///< Number of fragments
3205
3206 UINT_32 tileSwizzle; ///< Combined swizzle used to do bank/pipe rotation
3207
3208 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags
3209 } ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT;
3210
3211 /**
3212 ****************************************************************************************************
3213 * ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
3214 *
3215 * @brief
3216 * Output structure for Addr2ComputeFmaskCoordFromAddr
3217 ****************************************************************************************************
3218 */
3219 typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
3220 {
3221 UINT_32 size; ///< Size of this structure in bytes
3222
3223 UINT_32 x; ///< X coordinate
3224 UINT_32 y; ///< Y coordinate
3225 UINT_32 slice; ///< Slice index
3226 UINT_32 sample; ///< Sample index (fragment index for EQAA)
3227 UINT_32 plane; ///< Plane number
3228 } ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT;
3229
3230 /**
3231 ****************************************************************************************************
3232 * Addr2ComputeFmaskCoordFromAddr
3233 *
3234 * @brief
3235 * Compute FMASK coordinate from an given address
3236 ****************************************************************************************************
3237 */
3238 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskCoordFromAddr(
3239 ADDR_HANDLE hLib,
3240 const ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn,
3241 ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut);
3242
3243 ////////////////////////////////////////////////////////////////////////////////////////////////////
3244 // DCC key functions for Gfx9
3245 ////////////////////////////////////////////////////////////////////////////////////////////////////
3246
3247 /**
3248 ****************************************************************************************************
3249 * _ADDR2_COMPUTE_DCCINFO_INPUT
3250 *
3251 * @brief
3252 * Input structure of Addr2ComputeDccInfo
3253 ****************************************************************************************************
3254 */
3255 typedef struct _ADDR2_COMPUTE_DCCINFO_INPUT
3256 {
3257 UINT_32 size; ///< Size of this structure in bytes
3258
3259 ADDR2_META_FLAGS dccKeyFlags; ///< DCC key flags
3260 AddrResourceType resourceType; ///< Color surface type
3261 AddrSwizzleMode swizzleMode; ///< Color surface swizzle mode
3262 UINT_32 bpp; ///< bits per pixel
3263 UINT_32 unalignedWidth; ///< Color surface original width (of mip0)
3264 UINT_32 unalignedHeight; ///< Color surface original height (of mip0)
3265 UINT_32 numSlices; ///< Number of slices, of color surface (of mip0)
3266 UINT_32 numFrags; ///< Fragment number of color surface
3267 UINT_32 numMipLevels; ///< Total mipmap levels of color surface
3268 UINT_32 dataSurfaceSize; ///< The padded size of all slices and mip levels
3269 ///< useful in meta linear case
3270 UINT_32 firstMipIdInTail; ///< The id of first mip in tail, if no mip is in tail,
3271 /// it should be number of mip levels
3272 } ADDR2_COMPUTE_DCCINFO_INPUT;
3273
3274 /**
3275 ****************************************************************************************************
3276 * ADDR2_COMPUTE_DCCINFO_OUTPUT
3277 *
3278 * @brief
3279 * Output structure of Addr2ComputeDccInfo
3280 ****************************************************************************************************
3281 */
3282 typedef struct _ADDR2_COMPUTE_DCCINFO_OUTPUT
3283 {
3284 UINT_32 size; ///< Size of this structure in bytes
3285
3286 UINT_32 dccRamBaseAlign; ///< Base alignment of dcc key
3287 UINT_32 dccRamSize; ///< Size of dcc key
3288
3289 UINT_32 pitch; ///< DCC surface mip chain pitch
3290 UINT_32 height; ///< DCC surface mip chain height
3291 UINT_32 depth; ///< DCC surface mip chain depth
3292
3293 UINT_32 compressBlkWidth; ///< DCC compress block width
3294 UINT_32 compressBlkHeight; ///< DCC compress block height
3295 UINT_32 compressBlkDepth; ///< DCC compress block depth
3296
3297 UINT_32 metaBlkWidth; ///< DCC meta block width
3298 UINT_32 metaBlkHeight; ///< DCC meta block height
3299 UINT_32 metaBlkDepth; ///< DCC meta block depth
3300
3301 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice
3302
3303 union
3304 {
3305 UINT_32 fastClearSizePerSlice; ///< Size of DCC within a slice should be fast cleared
3306 UINT_32 dccRamSliceSize; ///< DCC ram size per slice. For mipmap, it's
3307 /// the slize size of a mip chain, the thickness of a
3308 /// a slice is meta block depth
3309 };
3310
3311 ADDR2_META_MIP_INFO* pMipInfo; ///< DCC mip information
3312 } ADDR2_COMPUTE_DCCINFO_OUTPUT;
3313
3314 /**
3315 ****************************************************************************************************
3316 * Addr2ComputeDccInfo
3317 *
3318 * @brief
3319 * Compute DCC key size, base alignment
3320 * info
3321 ****************************************************************************************************
3322 */
3323 ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccInfo(
3324 ADDR_HANDLE hLib,
3325 const ADDR2_COMPUTE_DCCINFO_INPUT* pIn,
3326 ADDR2_COMPUTE_DCCINFO_OUTPUT* pOut);
3327
3328 /**
3329 ****************************************************************************************************
3330 * ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT
3331 *
3332 * @brief
3333 * Input structure for Addr2ComputeDccAddrFromCoord
3334 *
3335 ****************************************************************************************************
3336 */
3337 typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT
3338 {
3339 UINT_32 size; ///< Size of this structure in bytes
3340
3341 UINT_32 x; ///< X coordinate
3342 UINT_32 y; ///< Y coordinate
3343 UINT_32 slice; ///< Index of slices
3344 UINT_32 sample; ///< Index of samples, means fragment index for EQAA
3345 UINT_32 mipId; ///< mipmap level id
3346
3347 ADDR2_META_FLAGS dccKeyFlags; ///< DCC flags
3348 AddrResourceType resourceType; ///< Color surface type
3349 AddrSwizzleMode swizzleMode; ///< Color surface swizzle mode
3350 UINT_32 bpp; ///< Color surface bits per pixel
3351 UINT_32 numSlices; ///< Color surface original slices (of mip0)
3352 UINT_32 numMipLevels; ///< Color surface mipmap levels
3353 UINT_32 numFrags; ///< Color surface fragment number
3354
3355 UINT_32 pipeXor; ///< pipe Xor setting
3356 UINT_32 pitch; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::pitch
3357 UINT_32 height; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::height
3358 UINT_32 compressBlkWidth; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::compressBlkWidth
3359 UINT_32 compressBlkHeight; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::compressBlkHeight
3360 UINT_32 compressBlkDepth; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::compressBlkDepth
3361 UINT_32 metaBlkWidth; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::metaBlkWidth
3362 UINT_32 metaBlkHeight; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::metaBlkHeight
3363 UINT_32 metaBlkDepth; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::metaBlkDepth
3364 UINT_32 dccRamSliceSize; ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::dccRamSliceSize
3365 } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT;
3366
3367 /**
3368 ****************************************************************************************************
3369 * ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT
3370 *
3371 * @brief
3372 * Output structure for Addr2ComputeDccAddrFromCoord
3373 ****************************************************************************************************
3374 */
3375 typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT
3376 {
3377 UINT_32 size; ///< Size of this structure in bytes
3378
3379 UINT_64 addr; ///< DCC address in bytes
3380 } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT;
3381
3382 /**
3383 ****************************************************************************************************
3384 * Addr2ComputeDccAddrFromCoord
3385 *
3386 * @brief
3387 * Compute DCC address according to coordinates (of MSAA color buffer)
3388 ****************************************************************************************************
3389 */
3390 ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccAddrFromCoord(
3391 ADDR_HANDLE hLib,
3392 const ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT* pIn,
3393 ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT* pOut);
3394
3395 ////////////////////////////////////////////////////////////////////////////////////////////////////
3396 // Misc functions for Gfx9
3397 ////////////////////////////////////////////////////////////////////////////////////////////////////
3398
3399 /**
3400 ****************************************************************************************************
3401 * ADDR2_COMPUTE_PIPEBANKXOR_INPUT
3402 *
3403 * @brief
3404 * Input structure of Addr2ComputePipebankXor
3405 ****************************************************************************************************
3406 */
3407 typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_INPUT
3408 {
3409 UINT_32 size; ///< Size of this structure in bytes
3410 UINT_32 surfIndex; ///< Input surface index
3411 ADDR2_SURFACE_FLAGS flags; ///< Surface flag
3412 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode
3413 AddrResourceType resourceType; ///< Surface resource type
3414 AddrFormat format; ///< Surface format
3415 UINT_32 numSamples; ///< Number of samples
3416 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3417 /// number of samples for normal AA; Set it to the
3418 /// number of fragments for EQAA
3419 } ADDR2_COMPUTE_PIPEBANKXOR_INPUT;
3420
3421 /**
3422 ****************************************************************************************************
3423 * ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT
3424 *
3425 * @brief
3426 * Output structure of Addr2ComputePipebankXor
3427 ****************************************************************************************************
3428 */
3429 typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT
3430 {
3431 UINT_32 size; ///< Size of this structure in bytes
3432 UINT_32 pipeBankXor; ///< Pipe bank xor
3433 } ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT;
3434
3435 /**
3436 ****************************************************************************************************
3437 * Addr2ComputePipeBankXor
3438 *
3439 * @brief
3440 * Calculate a valid bank pipe xor value for client to use.
3441 ****************************************************************************************************
3442 */
3443 ADDR_E_RETURNCODE ADDR_API Addr2ComputePipeBankXor(
3444 ADDR_HANDLE hLib,
3445 const ADDR2_COMPUTE_PIPEBANKXOR_INPUT* pIn,
3446 ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT* pOut);
3447
3448 /**
3449 ****************************************************************************************************
3450 * ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT
3451 *
3452 * @brief
3453 * Input structure of Addr2ComputeSlicePipeBankXor
3454 ****************************************************************************************************
3455 */
3456 typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT
3457 {
3458 UINT_32 size; ///< Size of this structure in bytes
3459 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode
3460 AddrResourceType resourceType; ///< Surface resource type
3461 UINT_32 basePipeBankXor; ///< Base pipe bank xor
3462 UINT_32 slice; ///< Slice id
3463 UINT_32 numSamples; ///< Number of samples
3464 } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT;
3465
3466 /**
3467 ****************************************************************************************************
3468 * ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
3469 *
3470 * @brief
3471 * Output structure of Addr2ComputeSlicePipeBankXor
3472 ****************************************************************************************************
3473 */
3474 typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
3475 {
3476 UINT_32 size; ///< Size of this structure in bytes
3477 UINT_32 pipeBankXor; ///< Pipe bank xor
3478 } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT;
3479
3480 /**
3481 ****************************************************************************************************
3482 * Addr2ComputeSlicePipeBankXor
3483 *
3484 * @brief
3485 * Calculate slice pipe bank xor value based on base pipe bank xor and slice id.
3486 ****************************************************************************************************
3487 */
3488 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSlicePipeBankXor(
3489 ADDR_HANDLE hLib,
3490 const ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT* pIn,
3491 ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT* pOut);
3492
3493 /**
3494 ****************************************************************************************************
3495 * ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
3496 *
3497 * @brief
3498 * Input structure of Addr2ComputeSubResourceOffsetForSwizzlePattern
3499 ****************************************************************************************************
3500 */
3501 typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
3502 {
3503 UINT_32 size; ///< Size of this structure in bytes
3504 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode
3505 AddrResourceType resourceType; ///< Surface resource type
3506 UINT_32 pipeBankXor; ///< Per resource xor
3507 UINT_32 slice; ///< Slice id
3508 UINT_64 sliceSize; ///< Slice size of a mip chain
3509 UINT_64 macroBlockOffset; ///< Macro block offset, returned in ADDR2_MIP_INFO
3510 UINT_32 mipTailOffset; ///< Mip tail offset, returned in ADDR2_MIP_INFO
3511 } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT;
3512
3513 /**
3514 ****************************************************************************************************
3515 * ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
3516 *
3517 * @brief
3518 * Output structure of Addr2ComputeSubResourceOffsetForSwizzlePattern
3519 ****************************************************************************************************
3520 */
3521 typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
3522 {
3523 UINT_32 size; ///< Size of this structure in bytes
3524 UINT_64 offset; ///< offset
3525 } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT;
3526
3527 /**
3528 ****************************************************************************************************
3529 * Addr2ComputeSubResourceOffsetForSwizzlePattern
3530 *
3531 * @brief
3532 * Calculate sub resource offset to support swizzle pattern.
3533 ****************************************************************************************************
3534 */
3535 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSubResourceOffsetForSwizzlePattern(
3536 ADDR_HANDLE hLib,
3537 const ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT* pIn,
3538 ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT* pOut);
3539
3540 /**
3541 ****************************************************************************************************
3542 * ADDR2_BLOCK_SET
3543 *
3544 * @brief
3545 * Bit field that defines block type
3546 ****************************************************************************************************
3547 */
3548 typedef union _ADDR2_BLOCK_SET
3549 {
3550 struct
3551 {
3552 UINT_32 micro : 1; // 256B block for 2D resource
3553 UINT_32 macroThin4KB : 1; // Thin 4KB for 2D/3D resource
3554 UINT_32 macroThick4KB : 1; // Thick 4KB for 3D resource
3555 UINT_32 macroThin64KB : 1; // Thin 64KB for 2D/3D resource
3556 UINT_32 macroThick64KB : 1; // Thick 64KB for 3D resource
3557 UINT_32 var : 1; // VAR block
3558 UINT_32 linear : 1; // Linear block
3559 UINT_32 reserved : 25;
3560 };
3561
3562 UINT_32 value;
3563 } ADDR2_BLOCK_SET;
3564
3565 /**
3566 ****************************************************************************************************
3567 * ADDR2_SWTYPE_SET
3568 *
3569 * @brief
3570 * Bit field that defines swizzle type
3571 ****************************************************************************************************
3572 */
3573 typedef union _ADDR2_SWTYPE_SET
3574 {
3575 struct
3576 {
3577 UINT_32 sw_Z : 1; // SW_*_Z_*
3578 UINT_32 sw_S : 1; // SW_*_S_*
3579 UINT_32 sw_D : 1; // SW_*_D_*
3580 UINT_32 sw_R : 1; // SW_*_R_*
3581 UINT_32 reserved : 28;
3582 };
3583
3584 UINT_32 value;
3585 } ADDR2_SWTYPE_SET;
3586
3587 /**
3588 ****************************************************************************************************
3589 * ADDR2_SWMODE_SET
3590 *
3591 * @brief
3592 * Bit field that defines swizzle type
3593 ****************************************************************************************************
3594 */
3595 typedef union _ADDR2_SWMODE_SET
3596 {
3597 struct
3598 {
3599 UINT_32 swLinear : 1;
3600 UINT_32 sw256B_S : 1;
3601 UINT_32 sw256B_D : 1;
3602 UINT_32 sw256B_R : 1;
3603 UINT_32 sw4KB_Z : 1;
3604 UINT_32 sw4KB_S : 1;
3605 UINT_32 sw4KB_D : 1;
3606 UINT_32 sw4KB_R : 1;
3607 UINT_32 sw64KB_Z : 1;
3608 UINT_32 sw64KB_S : 1;
3609 UINT_32 sw64KB_D : 1;
3610 UINT_32 sw64KB_R : 1;
3611 UINT_32 swReserved0 : 1;
3612 UINT_32 swReserved1 : 1;
3613 UINT_32 swReserved2 : 1;
3614 UINT_32 swReserved3 : 1;
3615 UINT_32 sw64KB_Z_T : 1;
3616 UINT_32 sw64KB_S_T : 1;
3617 UINT_32 sw64KB_D_T : 1;
3618 UINT_32 sw64KB_R_T : 1;
3619 UINT_32 sw4KB_Z_X : 1;
3620 UINT_32 sw4KB_S_X : 1;
3621 UINT_32 sw4KB_D_X : 1;
3622 UINT_32 sw4KB_R_X : 1;
3623 UINT_32 sw64KB_Z_X : 1;
3624 UINT_32 sw64KB_S_X : 1;
3625 UINT_32 sw64KB_D_X : 1;
3626 UINT_32 sw64KB_R_X : 1;
3627 UINT_32 swVar_Z_X : 1;
3628 UINT_32 swReserved4 : 1;
3629 UINT_32 swReserved5 : 1;
3630 UINT_32 swVar_R_X : 1;
3631 };
3632
3633 UINT_32 value;
3634 } ADDR2_SWMODE_SET;
3635
3636 /**
3637 ****************************************************************************************************
3638 * ADDR2_GET_PREFERRED_SURF_SETTING_INPUT
3639 *
3640 * @brief
3641 * Input structure of Addr2GetPreferredSurfaceSetting
3642 ****************************************************************************************************
3643 */
3644 typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_INPUT
3645 {
3646 UINT_32 size; ///< Size of this structure in bytes
3647
3648 ADDR2_SURFACE_FLAGS flags; ///< Surface flags
3649 AddrResourceType resourceType; ///< Surface type
3650 AddrFormat format; ///< Surface format
3651 AddrResrouceLocation resourceLoction; ///< Surface heap choice
3652 ADDR2_BLOCK_SET forbiddenBlock; ///< Client can use it to disable some block setting
3653 ///< such as linear for DXTn, tiled for YUV
3654 ADDR2_SWTYPE_SET preferredSwSet; ///< Client can use it to specify sw type(s) wanted
3655 BOOL_32 noXor; ///< Do not use xor mode for this resource
3656 UINT_32 bpp; ///< bits per pixel
3657 UINT_32 width; ///< Width (of mip0), in pixels
3658 UINT_32 height; ///< Height (of mip0), in pixels
3659 UINT_32 numSlices; ///< Number surface slice/depth (of mip0),
3660 UINT_32 numMipLevels; ///< Total mipmap levels.
3661 UINT_32 numSamples; ///< Number of samples
3662 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as
3663 /// number of samples for normal AA; Set it to the
3664 /// number of fragments for EQAA
3665 UINT_32 maxAlign; ///< maximum base/size alignment requested by client
3666 UINT_32 minSizeAlign; ///< memory allocated for surface in client driver will
3667 /// be padded to multiple of this value (in bytes)
3668 } ADDR2_GET_PREFERRED_SURF_SETTING_INPUT;
3669
3670 /**
3671 ****************************************************************************************************
3672 * ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT
3673 *
3674 * @brief
3675 * Output structure of Addr2GetPreferredSurfaceSetting
3676 ****************************************************************************************************
3677 */
3678 typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT
3679 {
3680 UINT_32 size; ///< Size of this structure in bytes
3681
3682 AddrSwizzleMode swizzleMode; ///< Suggested swizzle mode to be used
3683 AddrResourceType resourceType; ///< Suggested resource type to program HW
3684 ADDR2_BLOCK_SET validBlockSet; ///< Valid block type bit conbination
3685 BOOL_32 canXor; ///< If client can use xor on a valid macro block
3686 /// type
3687 ADDR2_SWTYPE_SET validSwTypeSet; ///< Valid swizzle type bit combination
3688 ADDR2_SWTYPE_SET clientPreferredSwSet; ///< Client-preferred swizzle type bit combination
3689 ADDR2_SWMODE_SET validSwModeSet; ///< Valid swizzle mode bit combination
3690 } ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT;
3691
3692 /**
3693 ****************************************************************************************************
3694 * Addr2GetPreferredSurfaceSetting
3695 *
3696 * @brief
3697 * Suggest a preferred setting for client driver to program HW register
3698 ****************************************************************************************************
3699 */
3700 ADDR_E_RETURNCODE ADDR_API Addr2GetPreferredSurfaceSetting(
3701 ADDR_HANDLE hLib,
3702 const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn,
3703 ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT* pOut);
3704
3705 /**
3706 ****************************************************************************************************
3707 * Addr2IsValidDisplaySwizzleMode
3708 *
3709 * @brief
3710 * Return whether the swizzle mode is supported by DCE / DCN.
3711 ****************************************************************************************************
3712 */
3713 ADDR_E_RETURNCODE ADDR_API Addr2IsValidDisplaySwizzleMode(
3714 ADDR_HANDLE hLib,
3715 AddrSwizzleMode swizzleMode,
3716 UINT_32 bpp,
3717 bool *result);
3718
3719 #if defined(__cplusplus)
3720 }
3721 #endif
3722
3723 #endif // __ADDR_INTERFACE_H__